【发布时间】:2010-02-28 16:50:34
【问题描述】:
背景
假设我正在为 GAE 制作应用程序,并且我想使用 API Hooks。
大编辑:在这个问题的原始版本中,我描述了我的用例,但有些人正确地指出它并不真正适合 API Hooks。的确!认为我有帮助。但现在我的问题是学术性的:我仍然不知道如何在实践中使用钩子,但我想这样做。我重写了我的问题,使其更加通用。
代码
所以我做了一个这样的模型:
class Model(db.Model):
user = db.UserProperty(required=True)
def pre_put(self):
# Sets a value, raises an exception, whatever. Use your imagination
然后我创建一个 db_hooks.py:
from google.appengine.api import apiproxy_stub_map
def patch_appengine():
def hook(service, call, request, response):
assert service == 'datastore_v3'
if call == 'Put':
for entity in request.entity_list():
entity.pre_put()
apiproxy_stub_map.apiproxy.GetPreCallHooks().Append('preput',
hook,
'datastore_v3')
由于受 TDD 困扰,我使用 GAEUnit 完成所有这些,所以在 gaeunit.py 中,就在 main 方法上方,我添加:
import db_hooks
db_hooks.patch_appengine()
然后我编写一个实例化并放置模型的测试。
问题
虽然patch_appengine() 肯定会被调用,但钩子永远不会。我错过了什么?如何让 pre_put 函数真正被调用?
【问题讨论】:
标签: python google-app-engine google-cloud-datastore