Wie kann ich eine app-Fabrik in Flasche / WSGI-Server, und warum sollte es unsicher sein?
Eine Frage zu app-callables, WSGI-Server und Kolben zirkuläre Importe
Ich bin (möglicherweise) verwechselt. Ich will sicher anlegen Kolben /WSGI-apps
von app-Fabriken und noch in der Lage sein, um Sie in WSGI-Server ganz einfach.
tl;dr
-
Kann ich sicher zu vermeiden, erstellen Sie eine app, die auf den import von init (als
empfohlen)aus, und erstellen Sie stattdessen später (dh mit einer factory-Methode) -
Wie mache ich, dass die app funktioniert ordentlich mit einem WSGI-server? Besonders
wenn ich bin vorbei und in der config andere Einstellungen nicht ziehen Sie
aus ENV
Beispiel::
def make_app(configdict, appname):
app = Flask(appname)
app.config.update(configdict)
init_db(configdict)
set_app_in_global_namespace(app)
#importing now will allow from pkg import app
from mypackage import views
return app
Ich würde gerne die oben genannten "Fabrik", denn ich will einfach contorl config für Tests usw.
Ich dann vermutlich anlegen möchten wsgi.py Modul, stellt die app zu einem WSGI-server.
So schließlich die Dinge sehen ein bisschen aus wie diese
init.VJ::
app = None
def make_app(configdict, appname):
flaskapp = Flask(appname)
flaskapp.config.update(configdict)
init_db(configdict)
global app
app = flaskapp
#importing now will allow from pkg import app
from mypackage import views
return flaskapp
wsgi.py::
from mypackage import app
app = make_app(configfromsomewhere, "myname")
uWSGI::
uwsgi --module=mypackage.wsgi:app
Aber noch wsgi.py ist NICHT etwas, was ich nennen kann, wie wsgi.py --Einstellungen=x --host=10.0.0.1
Also ich weiß wirklich nicht, wie pass die config in.
Ich Frage, weil während dies scheint ... OK ... es ist auch ein bisschen chaotisch.
Leben war einfacher, als alles, was in der ENV.
Nicht nur, aber auch:
Was ist also unsicher über die Verwendung eines app-Fabrik
Den Rat gegeben here <http://flask.pocoo.org/docs/patterns/packages>
_
ist ::
1. the Flask application object creation has to be in the
__init__.py file. That way each module can import it safely and
the __name__ variable will resolve to the correct package.
2. all the view functions (the ones with a route() decorator on
top) have to be imported in the __init__.py file. Not the object
itself, but the module it is in. Import the view module after
the application object is created.
re: 2., klar die route decorator erwartet bestimmte Fähigkeiten aus
instantiierte app und kann nicht ohne funktionieren. Das ist gut.
re: 1., OK, wir brauchen die Namen richtig. Aber was ist unsicher ? Und
warum? Ist es unsicher, zu importieren und verwenden Sie die app, wenn es ist uninitialised?
Nun, es wird brechen, aber das ist nicht unsicher.
Ist es die viel beschworene thread-lokalen? Evtl. Aber wenn ich am zupfen
app-Instanzen wohl oder übel von random Module sollte ich erwarten, dass Schwierigkeiten.
Auswirkungen - wir verweisen nicht auf das app-Objekt aus alles andere als die Aussicht - im wesentlichen halten wir unsere Modularisierung schön und dicht, und pass around
dicts -, Fehler-Objekte, oder auch WebObs.
http://flask.pocoo.org/docs/patterns/appdispatch
http://flask.pocoo.org/docs/deploying/#deployment
http://flask.pocoo.org/docs/patterns/packages/#larger-applications
http://flask.pocoo.org/docs/becomingbig
Du musst angemeldet sein, um einen Kommentar abzugeben.
Entsprechend der Kolben-Dokumentation, einer Anwendung, die Fabrik ist gut, weil:
Aber, wie heißt es in der Andere Tests Tricks Abschnitt der Dokumentation, wenn Sie mit der Anwendung Fabriken die Funktionen
before_request()
undafter_request()
wird nicht automatisch aufgerufen.In den nächsten Abschnitten werde ich zeigen, wie ich habe mit der application factory-Muster mit der uWSGI application server und nginx (die ich nur benutzt habe, aber ich kann versuchen zu helfen, konfigurieren Sie es mit einem anderen server).
Die Anwendung Factory
So, lassen Sie uns sagen, Sie haben Ihre Anwendung in den Ordner yourapplication und innen gibt es die
__init__.py
Datei:Nun müssen Sie eine Datei zum erstellen einer Instanz der app:
In den obigen code habe ich vorausgesetzt, es gibt eine Umgebungsvariable mit dem Pfad zu der config-Datei, aber man könnte die config Pfad zu der Fabrik, wie diese:
Alternativ könnte man so etwas wie ein Wörterbuch mit Umgebungen und die entsprechenden config-Dateien:
In diesem Fall, die
load_config
- Funktion würde wie folgt Aussehen:Nginx und uWSGI
Hier ist ein Beispiel einer Konfigurationsdatei für nginx:
Und die uWSGI-Konfigurationsdatei sieht wie folgt aus:
Wie zu verwenden
before_request()
undafter_request()
Das problem mit diesen Funktionen ist, dass, wenn Ihr ihn anruft in anderen Modulen, die Module können nicht importiert werden, bevor die Anwendung instanziiert wurde. Wieder, die Dokumentation hat etwas dazu zu sagen:
Oder Sie könnten erstellen einer Erweiterung, dann importieren Sie die Klasse, ohne alle existierenden Instanzen der Flachmann, als die Klasse Erweiterung würde nur die Verwendung der Kolben-Instanz nach dem anlegen.