GAE: ValueError: insecure string pickle
我无法从Google App Engine中取消对象。我正在运行Windows 7.这是程序:
CSV看起来像这样:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | INFO,2210,"CS 2110, 3300, 3140","(lp0 (lp1 (S'CS' p2 I2110 tp3 a(g2 I3300 tp4 a(g2 I3140 tp5 aa." CS,3110,CS 2110 or equivalent experience,"(lp0 (lp1 (S'CS' p2 I2110 tp3 aa." MSE,4102,"MATH 2210, 2230, 2310, or 2940","(lp0 (lp1 (S'MATH' p2 I2210 tp3 a(g2 I2230 tp4 a(g2 I2310 tp5 aa(lp6 (g2 I2940 tp7 aa." |
(是的,
课程模式:
1 2 3 4 5 6 7 8 | class Course(db.Model): dept_code = db.StringProperty() number = db.IntegerProperty() raw_pre_reqs = db.StringProperty(multiline=True) original_description = db.StringProperty() def getPreReqs(self): pickle.loads(str(self.raw_pre_reqs)) |
DataLoader.py:
1 2 3 4 5 6 7 8 9 10 | class CourseLoader(bulkloader.Loader): def __init__(self): bulkloader.Loader.__init__(self, 'Course', [('dept_code', str), ('number', int), ('original_description', str), ('raw_pre_reqs', str) ]) loaders = [CourseLoader] |
尝试unpickle:
class MainHandler(webapp.RequestHandler):
1 2 3 4 5 6 7 8 9 10 11 | def get(self): self.writeOut('cock!') self.writeOut(' ') courses = Course().all() for c in courses: self.writeOut("%s => %s" % (c.raw_pre_reqs, c.getPreReqs())) def writeOut(self, string): self.response.out.write(string) |
观察错误:
Traceback(最近一次调用最后一次):
文件"C: Program Files Google google_appengine google appengine ext webapp__init __。py",第511行,正在通话中
handler.get(*基团)
文件"main.py",第30行,在get中
self.writeOut("%s =>%s"%(c.raw_pre_reqs,c.getPreReqs()))
在getPreReqs中输入第17行的文件"src Models.py"
pickle.loads(STR(self.raw_pre_reqs))
文件"C: Python26 lib pickle.py",第1374行,在加载中
返回Unpickler(文件).load()
加载文件"C: Python26 lib pickle.py",第858行
dispatchkey
在load_string中的文件"C: Python26 lib pickle.py",第966行
提出ValueError,"不安全的字符串泡菜"
ValueError:不安全的字符串pickle
我在这做错了什么?
Pickle是二进制格式,CSV不是二进制安全的。 您需要对您的pickle进行编码 - 例如,使用base64.b64encode - 如果您想以文本格式传输它。
Pickle可以是二进制格式,但默认情况下它完全是ASCII安全的(协议0)。 阅读pickle文档了解具体信息:pickle.dump。
它通常会有换行符,因此在使用基于行的格式(如CSV)时必须考虑到这一点。
如果您正在阅读其他人的泡菜,他们可能已经使用了二进制协议,但您粘贴的输出看起来像正常的酸洗。