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 に答える