2017-07-18 3 views
2

Nach the Flask 0.12 docs:Warum kann ich flask.g nicht verwenden, nachdem eine Anfrage kommt?

flask.g

...... Beginnend mit Flask 0,10 diese über die Anwendung Kontext gespeichert ist, und nicht mehr auf dem Anforderungskontext, die es bedeutet, wird zur Verfügung, wenn nur der Anwendungskontext ist gebunden und noch nicht eine Anfrage.

Soweit ich weiß, wenn eine Anfrage kommt, wird ein Anwendungskontext erstellt, wenn es keinen gibt. Sollte also nicht flask.g verfügbar sein, nachdem eine Anfrage gekommen ist, da die Anfrage das Vorhandensein eines Anwendungskontextes sicherstellt?

Als Boun Frage: Warum sollte ich Datenbankverbindungen auf g statt request speichern? Ich weiß, dass das Erstellen eines Anwendungskontexts weniger "teuer" ist als das Erstellen eines Anforderungskontexts, aber wenn eine Anforderung kommt, wird trotzdem ein Anforderungskontext erstellt.

Antwort

2

Der Wortlaut dort ist ein wenig peinlich. Das Objekt g ist während einer Anfrage sowie verfügbar. Ein Anforderungskontext ist in einem Anwendungskontext verschachtelt.

Sie sollten eine Datenbankverbindung im g Objekt speichern, weil es * auch verfügbar sein wird, wenn es keine Anforderung, wie im flask shell Befehl ist, und jede custom command-line commands. Sie benötigen dies zum Beispiel, wenn Sie Ihre Datenbank initialisieren.

Als nächstes gibt es erweiterte Anwendungsfälle, in denen Sie eine 'interne' Anfrage erstellen und eine andere Route auf Ihrer Flask App aufrufen möchten, als käme sie von außerhalb. Diese verschachtelte Anforderung würde den vorhandenen App-Kontext erneut verwenden.

Es gibt niemals einen Anfragekontext ohne einen Anwendungskontext.

+0

Danke, Sir, das macht Sinn. Aber es gibt ein Problem, wenn eine Anfrage kommt und ein Anwendungskontext bereits existiert: aus dem [Quellcode] (https://github.com/pallets/flask/blob/1949c4a9abc174bf29620f6dd8ceab9ed3ace2eb/flask/ctx.py#L230) scheint es, dass der vorhandene Anwendungskontext würde wiederverwendet werden, wenn app_ctx None oder app_ctx.app! = self.app ist, aber die Dokumentation gibt an, dass ein Anwendungskontext [nicht zwischen Anfragen geteilt wird] (http://flask.pocoo.org/) docs/0.12/appcontext/# locality-of-the-context) ... –

+1

Dieser Code stellt sicher, dass der richtige Anforderungskontext mit dem richtigen Anwendungskontext gepaart wird, nicht mehr. Der App-Kontext * immer * existiert bereits, wenn eine Anfrage eingeht.Durch diesen Code wird sichergestellt, dass der Anwendungskontext für diese Anforderung oben auf dem Stapel liegt, sodass der gesamte für diese Anforderung ausgeführte Code über das richtige Objekt "flask.g" verfügt. –

+0

Dies gilt nur, wenn mehr als ein App-Kontext aktiv ist. –

0

flask.g ist an die Sitzung der aktuellen Anfrage gebunden. Das bedeutet, dass Sie verschiedene g für verschiedene Anfragen haben. Zum Beispiel speichere ich einen Benutzer in g-Objekt für eine leichteren Zugang zu ihm (es ist nicht gut, aber schnell zugreifen und einfach zu bedienen) von Flask

2

Answering Bonusfrage documentation:

Zum Beispiel der request Variable ist das Anforderungsobjekt, das mit der aktuellen Anforderung zugeordnet ist, während g eine allgemeine Variable ist, die dem aktuellen Anwendungskontext zugeordnet ist.

Verwandte Themen