GAE:ValueError:不安全的字符串泡菜

时间:2010-06-03 05:55:35

标签: python google-app-engine pickle

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

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

    (是的,这些是\n生成的pickle.dumps()

    1. 将此文件加载到google app engine devserver:
    2. 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. 确认数据已成功加载:
      2. data store individual entity

        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. 观察错误:

          追踪(最近一次呼叫最后一次):

          文件“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()))

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

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

          加载文件“C:\ Python26 \ lib \ pickle.py”,第858行     dispatchkey

          文件“C:\ Python26 \ lib \ pickle.py”,第966行,在load_string中     提出ValueError,“不安全的字符串pickle”

          ValueError:不安全的字符串pickle

        3. 我在这里做错了什么?

2 个答案:

答案 0 :(得分:4)

Pickle是二进制格式,CSV不是二进制安全的。你需要对你的pickle进行编码 - 例如,使用base64.b64encode - 如果你想以文本格式传输它。

答案 1 :(得分:2)

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

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

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