【问题标题】:GAE: ValueError: insecure string pickleGAE:ValueError:不安全的字符串泡菜
【发布时间】:2011-02-27 03:52:58
【问题描述】:

我在从 Google App Engine 中提取对象时遇到问题。我正在运行 Windows 7。这是过程:

  1. 创建一个 CSV,其中一个字段为 pickle.dumps([[('CS', 2110), ('CS', 3300), ('CS', 3140)]]),或一些类似的参数。

CSV 看起来像这样:

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."

(是的,那些是pickle.dumps()制作的\ns)

  1. 将此文件加载到谷歌应用引擎开发服务器中:

appcfg.py upload_data --config_file="DataLoader.py" --filename="pre_req_data.csv" --kind=Course --url=http://localhost:8083/remote_api "appdir"

课程模式

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

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]
  1. 确认数据加载成功:

  1. 尝试解开:

    类 MainHandler(webapp.RequestHandler):

    def get(self):
        self.writeOut('cock!')
        self.writeOut('\n')
    
        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)
    
  2. 观察错误:

    Traceback(最近一次通话最后一次):

    调用中的文件“C:\Program Files\Google\google_appengine\google\appengine\ext\webapp__init__.py”,第 511 行 handler.get(*groups)

    文件“main.py”,第 30 行,在 get self.writeOut("%s => %s" % (c.raw_pre_reqs, c.getPreReqs()))

    文件“src\Models.py”,第 17 行,在 getPreReqs 中 pickle.loads(str(self.raw_pre_reqs))

    文件“C:\Python26\lib\pickle.py”,第 1374 行,加载中 return Unpickler(file).load()

    文件“C:\Python26\lib\pickle.py”,第 858 行,加载中 调度键

    文件“C:\Python26\lib\pickle.py”,第 966 行,在 load_string 引发 ValueError,“不安全的字符串泡菜”

    ValueError: 不安全的字符串pickle

我在这里做错了什么?

【问题讨论】:

    标签: python google-app-engine pickle


    【解决方案1】:

    Pickle 可以是二进制格式,但默认情况下它是完全 ASCII 安全的(协议 0)。阅读 pickle 文档了解详情:pickle.dump

    它通常会有换行符,因此在使用基于行的格式(例如 CSV)时必须考虑到这一点。

    如果您正在阅读其他人的 pickle,他们可能使用了二进制协议,但您粘贴的输出看起来像正常的 pickle。

    【讨论】:

      【解决方案2】:

      Pickle 是一种二进制格式,而 CSV 不是二进制安全的。你需要对你的泡菜进行编码——比如,使用 base64.b64encode——如果你想以文本格式传输它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多