HintergrundApp Engine (Python) Datastore precall API Hooks
Also lassen Sie uns sagen, ich mache App für GAE, und ich möchte API Hooks verwenden.
BIG EDIT: In der ursprünglichen Version dieser Frage beschrieb ich meinen Anwendungsfall, aber einige Leute richtig darauf hingewiesen, dass es nicht wirklich für API-Hooks geeignet war. Gewährt! Betrachte mich als geholfen. Aber jetzt ist mein Thema akademisch: Ich weiß immer noch nicht, wie man Hooks in der Praxis benutzt, und ich würde es gerne tun. Ich habe meine Frage neu geschrieben, um sie allgemeiner zu machen.
-Code
Also mache ich ein Modell wie folgt aus:
class Model(db.Model):
user = db.UserProperty(required=True)
def pre_put(self):
# Sets a value, raises an exception, whatever. Use your imagination
Und dann erstelle ich eine 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')
Being TDD-verwirrten, Ich mache das alles mit GAEUnit, also in gaeunit.py, knapp über t Er Hauptmethode, ich füge hinzu:
Und dann schreibe ich einen Test, der instanziiert und setzt ein Modell.
Frage
Während patch_appengine()
definitiv genannt wird, ist der Haken nie. Was vermisse ich? Wie kann ich die pre_put-Funktion tatsächlich aufrufen lassen?
Ah, verdammt, du hast absolut recht. Wie steht es mit der Durchsetzung der Einzigartigkeit pro Konto? Wäre das nicht am besten, indem Sie vor einem Put überprüfen? –
Wenn Sie die Eindeutigkeit erzwingen möchten, müssen Sie dies vor dem ersten put überprüfen, der die Entität im Datenspeicher erstellt. Wenn Sie dem Benutzer verbieten, diesen Wert zu ändern - was eine gute Idee ist - müssen Sie nur die Erstellung überprüfen. –
Wahr, und in beiden Fällen werde ich nur eine Methode schreiben, die die Überprüfungen und Aktualisierungen durchführt, die ich will, bevor ich setze, und dann diese anstelle von put() verwenden. Vielen Dank. –