Фон
Так скажем, я делаю приложение для GAE, и я хочу использовать Рычаги API.
БОЛЬШОЕ РЕДАКТИРОВАНИЕ: В исходной версии этого вопроса я описал свой вариант использования, но некоторые люди правильно указали, что это действительно не подошло для Рычагов API. Предоставленный! Рассмотрите меня, помог. Но теперь моя проблема является академической: Я все еще не знаю, как использовать рычаги на практике, и я хотел бы. Я переписал свой вопрос сделать его намного более универсальным.
Код
Таким образом, я делаю модель как это:
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, чуть выше основного метода, я добавляю:
import db_hooks
db_hooks.patch_appengine()
И затем я пишу тест, который инстанцирует и помещает Модель.
Вопрос
В то время как patch_appengine()
определенно называется, рычаг никогда не. Что я пропускаю? Как я заставляю функцию pre_put на самом деле называться?
Я не думаю, что хуки действительно решат эту проблему. Хуки будут работать только в контексте вашего приложения AppEngine, но пользователь может изменить свой псевдоним вне вашего приложения, используя настройки учетной записи Google. Если они это сделают, это не приведет к запуску какой-либо логической реализации в ваших хуках.
Я думаю, что реальное решение вашей проблемы состоит в том, чтобы ваше приложение управляло своим собственным псевдонимом, независимым от того, который предоставляется сущностью Users.
Хуки - это немного низкий уровень для текущей задачи. Вероятно, вам нужен пользовательский класс свойств. DerivedProperty, от aetycoon , - это просто билет.
Однако имейте в виду, что поле 'псевдонима' объекта пользователя, вероятно, не то, что вы хотите - согласно документам , это просто пользовательская часть поля электронной почты, если они используют учетную запись Gmail, в противном случае это их полный адрес электронной почты. Вместо этого вы, вероятно, захотите позволить пользователям устанавливать свои собственные псевдонимы.