关于python:GAE:ValueError:不安全的字符串pickle

GAE: ValueError: insecure string pickle

我无法从Google App Engine中取消对象。我正在运行Windows 7.这是程序:

  • 创建一个CSV,其中一个字段为pickle.dumps([[('CS', 2110), ('CS', 3300), ('CS', 3140)]]),或者某个类似的参数。
  • 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."

    (是的,pickle.dumps()生成的
    )

  • 将此文件加载到Google应用引擎devserver:
  • appcfg.py upload_data --config_file="DataLoader.py" --filename="pre_req_data.csv" --kind=Course --url=http://localhost:8083/remote_api"appdir"

    课程模式:

    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]
  • 确认数据已成功加载:
  • data store individual entity

  • 尝试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)时必须考虑到这一点。

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