1

我有这段代码,它在升级 GAE Python NDB 之前可以工作:

class MyHandler(webapp2.RequestHandler):
  def get(self,urlString):
    resume = ndb.Key(urlsafe=urlString).get()

现在,我有这个错误:

Traceback (most recent call last):
  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1535, in __call__
    rv = self.handle_exception(request, response, e)
  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1529, in __call__
    rv = self.router.dispatch(request, response)
  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1278, in default_dispatcher
    return route.handler_adapter(request, response)
  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1102, in __call__
    return handler.dispatch()
  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 572, in dispatch
    return self.handle_exception(e, self.app.debug)
  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 570, in dispatch
    return method(*args, **kwargs)
  File "C:\xampp\htdocs\mapjobs\main.py", line 127, in get
    resume_key = ndb.Key(urlsafe=urlString)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\ndb\key.py", line 212, in __new__
    self.__reference = _ConstructReference(cls, **kwargs)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\ndb\utils.py", line 136, in positional_wrapper
    return wrapped(*args, **kwds)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\ndb\key.py", line 642, in _ConstructReference
    reference = _ReferenceFromSerialized(serialized)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\ndb\key.py", line 774, in _ReferenceFromSerialized
    return entity_pb.Reference(serialized)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\datastore\entity_pb.py", line 1791, in __init__
    if contents is not None: self.MergeFromString(contents)
  File "C:\Program Files (x86)\Google\google_appengine\google\net\proto\ProtocolBuffer.py", line 84, in MergeFromString
    self.MergePartialFromString(s)
  File "C:\Program Files (x86)\Google\google_appengine\google\net\proto\ProtocolBuffer.py", line 98, in MergePartialFromString
    self.TryMerge(d)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\datastore\entity_pb.py", line 1920, in TryMerge
    d.skipData(tt)
  File "C:\Program Files (x86)\Google\google_appengine\google\net\proto\ProtocolBuffer.py", line 524, in skipData
    self.skip(4)
  File "C:\Program Files (x86)\Google\google_appengine\google\net\proto\ProtocolBuffer.py", line 499, in skip
    if self.idx + n > self.limit: raise ProtocolBufferDecodeError, "truncated"
ProtocolBufferDecodeError: truncated

亮点可能是:

File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 570, in dispatch
  return method(*args, **kwargs)
File "C:\xampp\htdocs\mapjobs\main.py", line 127, in get
  resume_key = ndb.Key(urlsafe=urlString)

怎么了?

4

2 回答 2

3

我的猜测是,您通过 Url 参数接收密钥作为 url 安全字符串,由于浏览器中的最大 Url 长度限制,该参数被截断。实际上,浏览器将 URL 长度限制为最多 2000 个字符。请参阅此问题:不同浏览器中 URL 的最大长度是多少?

如果您的密钥包含(多个)父密钥,则可能超过 2000 个字符。是这样吗?请在创建和接收时检查 urlsafe 编码密钥的长度。

如果是这种情况,那么解决方法是仅使用实体的 ID(或在父键的情况下使用实体)并手动构造键。

于 2013-10-23T06:47:38.200 回答
0

我与之前的网址不匹配:

app = webapp2.WSGIApplication([
    ('/', MainHandler),
    ('/jobs',JobsHandler),
    ('/job/(.*)',JobHandler),
    ('/job/(.*)/update', JobUpdateHandler),
    ('/job/(.*)/delete', JobDeleteHandler),
    ('/job/create', JobCreateHandler),
    ('/resume/(.*)',ResumeHandler),
    ('/resume/(.*)/update', ResumeUpdateHandler),
    ('/resume/(.*)/delete', ResumeDeleteHandler),
    ('/resume/create', ResumeCreateHandler),
    ('/resumes',ResumesHandler),
    ('/profile',ProfileHandler),
    ('/profile/(.*)/update', ProfileUpdateHandler),
], debug=True)

请注意,我错误地排列了“/resume/(.*)”,因为它应该位于最后接收 urlString 的底部。现在是这样的:

app = webapp2.WSGIApplication([
    ('/', MainHandler),
    ('/jobs',JobsHandler),
    ('/job/(.*)/update', JobUpdateHandler),
    ('/job/(.*)/delete', JobDeleteHandler),
    ('/job/create', JobCreateHandler),
    ('/job/(.*)',JobHandler),
    ('/resume/(.*)/update', ResumeUpdateHandler),
    ('/resume/(.*)/delete', ResumeDeleteHandler),
    ('/resume/create', ResumeCreateHandler),
    ('/resume/(.*)',ResumeHandler),
    ('/resumes',ResumesHandler),
    ('/profile',ProfileHandler),
    ('/profile/(.*)/update', ProfileUpdateHandler),
], debug=True)
于 2013-10-23T07:08:01.687 回答