Flask langlebige globale Ressourcen

9

Ich verwende Flask, um meine Webanwendung zu erstellen, und ich möchte eine globale Ressource registrieren, die eine Verbindung zu einem Remotedienst darstellt, die länger dauert als eine Anforderung (in diesem Fall ist die Verbindung eine SOAP-Verbindung, die kann für bis zu 30 Tage gültig sein).

Ein anderes Beispiel könnte eine Datenbank wie MongoDB sein, die Verbindungspooling im Treiber behandelt, und würde schlecht funktionieren, wenn Sie bei jeder Anfrage eine neue Verbindung erstellen.

Weder der Anwendungskontext noch der Anfragekontext scheinen für diese Aufgabe geeignet zu sein.

Die Frage " Übergeben Sie ein anderes Objekt an die Hauptkalkapplikation "schlägt vor, dass wir solche Ressourcen im Verzeichnis app.config speichern.

    
idbentley 23.10.2013, 16:14
quelle

2 Antworten

3

Wenn es mit der Instanziierung Ihrer App übereinstimmen MUSS, sollten Sie Flask ableiten. Das macht wirklich nicht viel, wenn Sie nur eine Ressource an das Objekt anhängen, da die Erstellung der App ein Prozess ist. Die Wahrheit ist, dass Sie dies wahrscheinlich nicht tun müssen, wenn die Anwendung Ihre Ressource während der Instanziierung nicht verwenden muss.

%Vor%

Wenn Sie nicht über einen bestimmten Anwendungsfall verfügen, sollten Sie wahrscheinlich eine Wrapper-Klasse schreiben, sie in eine flask-Erweiterung umwandeln, sie auf Modulebene erstellen und auf app.extensions speichern.

%Vor%

Dann können Sie wählen, ob Sie jeder App eine eigene Ressource zuweisen möchten (wie oben), oder wenn Sie lieber eine freigegebene Ressource verwenden möchten, die immer auf die aktuelle App verweist

%Vor%

Ich denke nicht, dass Sie dies im Anwendungskontext speichern möchten, weil "es beginnt, wenn das Flask-Objekt instanziiert wird, und es endet implizit, wenn die erste Anfrage kommt"

Stattdessen möchten Sie, dass Ihre Ressource auf Modulebene erstellt wird. Dann können Sie es als Erweiterung an die Anwendung anhängen, oder ja, sogar in der Konfiguration - obwohl es konsequenter und logischer wäre, eine schnelle Erweiterung daraus zu machen.

    
ramabodhi 18.02.2014 06:16
quelle
0

Dies ist ein Python-Problem, der Grund, warum Flask und andere Web-Frameworks dies nicht zulassen / sehr schwierig machen, ist, weil es kein definiertes Speichermodell für Parallelität gibt. Z.B. Angenommen, Ihr Webserver bedient Anfragen in seinen eigenen Prozessen (z. B. Gunicorn). Dies führt dazu, dass Prozesse den Hauptprozess abzweigen und somit Ihre "globale" Variable kopieren. Wenn Sie einen Server unter Windows ausführen, wird aufgrund des Fehlens einer Verzweigung stattdessen ein neuer Prozess erstellt, bei dem alle Module erneut importiert werden. Dies führt möglicherweise zu einer sauberen Version Ihres globalen Status, der sich nicht an Änderungen im Hauptprozess erinnert -Faden. Oder es gar nicht zu finden, wenn du es hinter einem Namenswächter deklarierst.

Es gibt nur zwei Möglichkeiten, dies konsequent "richtig" zu machen. Eine besteht darin, eine Webanwendung speziell für den globalen Status zu erstellen, die auf einen einzelnen Thread beschränkt ist, und den anderen WebApp-Aufrufstatus über diese Webanwendung zu erhalten.

Die zweite Möglichkeit besteht darin, Jython + -Threads zu verwenden. Da Jython in einer JVM ausgeführt wird, verfügt es über ein gut definiertes Speichermodell mit gemeinsamem Status, so dass Sie alle Java-EE-Tricks wie containergesteuerte Nebenläufigkeit ... verwenden können.

    
phil_20686 19.09.2016 14:54
quelle

Tags und Links