设置为memcache后属性消失了吗?

时间:2014-06-26 21:09:17

标签: python google-app-engine memcached pickle

我正在使用Appengine的内存缓存。

我有一个类TaskGroup,我将动态设置一个属性。

from mempo.models import Task, Order, TaskAction, TaskGroup
from google.appengine.ext import ndb
from google.appengine.api import memcache

tg = TaskGroup.query().fetch(1)[0]
print 1, tg 
setattr(tg, TaskGroup.JSON_TASKS_KEY, {'hello': 'world'})
print 2, getattr(tg, TaskGroup.JSON_TASKS_KEY)

KEY = 'mc_key'
memcache.delete(KEY)
memcache.set(KEY, tg)

tg2 = memcache.get(KEY)
print 3, getattr(tg2, TaskGroup.JSON_TASKS_KEY)

这是交互式控制台的输出:

1 TaskGroup(key=Key('TaskGroup', 4504974016905216), order=Key('Order', 5491235947020288), order_entry_serial=u'fc5766b2bbad4905be8753f9a6300009', orphaned=False, state=TaskGroupState(UNSTARTED, 10))
2 {'hello': 'world'}
3Traceback (most recent call last):
  File "/home/vng/google_appengine/google/appengine/tools/devappserver2/python/request_handler.py", line 216, in handle_interactive_request
    exec(compiled_code, self._command_globals)
  File "<string>", line 16, in <module>
AttributeError: 'TaskGroup' object has no attribute 'json_tasks'

AFAIK,pickle转储动态设置的属性:

class Foo():
    pass

f = Foo()

pickle.dumps(f)
Out[4]: '(i__main__\nFoo\np0\n(dp1\nb.'

In [5]: setattr(f, 'hello', 'world')

In [6]: pickle.dumps(f)
Out[6]: "(i__main__\nFoo\np0\n(dp1\nS'hello'\np2\nS'world'\np3\nsb."

有人能告诉我为什么appengine的memcache没有腌制我的JSON_TASKS_KEY属性?

1 个答案:

答案 0 :(得分:1)

这与ndb如何处理酸洗有关。 ndb.Model实现__getstate__,允许它覆盖它的腌制方式。特别是,ndb通过转换为它的内部序列化表示来处理它,然后对其进行编码。此内部表示仅存储它知道的属性。

如果您想将动态属性与ndb一起使用,则应该让模型扩展ndb.Expando而不是ndb.Model