Dies ist sehr ähnlich zu einer anderen Frage, die über 3 Jahre alt ist: Was ist eine gute allgemeine Methode, um SQLAlchemy-Transaktionen mit einem authentifizierten Benutzer usw. abzugleichen?
Ich arbeite an einer Anwendung, in der ich alle Änderungen an bestimmten Tabellen protokollieren möchte. Es gibt zur Zeit ein wirklich gutes "Rezept", das die Versionierung durchführt , aber ich muss es ändern um stattdessen eine Datetime aufzuzeichnen, wenn die Änderung aufgetreten ist, und eine Benutzer-ID, wer die Änderung vorgenommen hat. Ich habe das Beispiel history_meta.py genommen, das mit SQLAlchemy gepackt ist, und dafür gesorgt, dass es anstelle von Versionsnummern aufgezeichnet wird, aber ich habe Probleme herauszufinden, wie ich eine Benutzer-ID weitergeben kann.
Die Frage, auf die ich oben Bezug genommen habe, schlägt vor, die Benutzer-ID in das Sitzungsobjekt aufzunehmen. Das macht sehr viel Sinn, aber ich bin mir nicht sicher, wie ich das machen soll. Ich habe versucht etwas einfaches wie session.userid = authenticated_userid(request)
, aber in history_meta.py scheint dieses Attribut nicht mehr auf dem Sitzungsobjekt zu sein.
Ich mache das alles im Pyramid-Framework und das Session-Objekt, das ich verwende, ist als DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
definiert. In einer Ansicht mache ich session = DBSession()
und fahre fort mit session
. (Ich bin mir nicht sicher, ob das nötig ist, aber genau das passiert)
Hier ist meine modifizierte history_meta.py für den Fall, dass jemand es nützlich finden könnte:
%Vor% UPDATE:
Okay, es scheint, dass in der Methode before_flush () die Sitzung, die ich bekomme, vom Typ sqlalchemy.orm.session.Session
ist, wobei die Sitzung, an die ich die user_id
angehängt habe, sqlalchemy.orm.scoping.scoped_session
war. Irgendwann wird eine Objektschicht abgezogen. Ist es sicher, die user_id innerhalb der scoped_session der Session zuzuweisen? Kann ich sicher sein, dass es für andere Anfragen nicht da sein wird?
Nach ein paar Tricks scheint es mir möglich, Werte für das Session-Objekt in der scoped_session zu setzen, indem ich Folgendes mache:
%Vor% Jetzt hat das Objekt session
, das in history_meta.py herumgereicht wird, ein Attribut user_id
, das ich gesetzt habe. Ich bin ein wenig besorgt darüber, ob dies der richtige Weg ist, dies zu tun, da das Objekt in der Registrierung ein thread-lokaler ist und die Threads für verschiedene HTTP-Anfragen wiederverwendet werden.
Tags und Links python sqlalchemy pyramid