Als Ergänzung zu den Informationen in diesem Thread: Ich war auch ein bisschen verwirrt über das Verhalten von flask.g
, aber einige schnelle Tests haben mir geholfen, dies zu klären. Folgendes habe ich ausprobiert:
from flask import Flask, g
app = Flask(__name__)
with app.app_context():
print('in app context, before first request context')
print('setting g.foo to abc')
g.foo = 'abc'
print('g.foo should be abc, is: {0}'.format(g.foo))
with app.test_request_context():
print('in first request context')
print('g.foo should be abc, is: {0}'.format(g.foo))
print('setting g.foo to xyz')
g.foo = 'xyz'
print('g.foo should be xyz, is: {0}'.format(g.foo))
print('in app context, after first request context')
print('g.foo should be abc, is: {0}'.format(g.foo))
with app.test_request_context():
print('in second request context')
print('g.foo should be abc, is: {0}'.format(g.foo))
print('setting g.foo to pqr')
g.foo = 'pqr'
print('g.foo should be pqr, is: {0}'.format(g.foo))
print('in app context, after second request context')
print('g.foo should be abc, is: {0}'.format(g.foo))
Und hier ist die Ausgabe, die es gibt:
in app context, before first request context
setting g.foo to abc
g.foo should be abc, is: abc
in first request context
g.foo should be abc, is: abc
setting g.foo to xyz
g.foo should be xyz, is: xyz
in app context, after first request context
g.foo should be abc, is: xyz
in second request context
g.foo should be abc, is: xyz
setting g.foo to pqr
g.foo should be pqr, is: pqr
in app context, after second request context
g.foo should be abc, is: pqr
Wie der Y4Kman oben sagte: "Jede Anfrage drückt einen neuen Anwendungskontext". Und wie in den Flask-Dokumenten angegeben, wird der Anwendungskontext "nicht zwischen Anforderungen geteilt". Was jetzt nicht explizit angegeben wurde (obwohl ich denke, dass dies aus diesen Aussagen hervorgeht), und was meine Tests deutlich zeigen, ist, dass Sie niemals explizit mehrere Anforderungskontexte erstellen sollten , die in einem Anwendungskontext verschachtelt sind, weil flask.g
(und co) dies nicht tun. Es gibt keine Magie, durch die es in den zwei verschiedenen "Kontextebenen" funktioniert, wobei verschiedene Zustände unabhängig voneinander auf Anwendungs- und Anforderungsebene existieren.
Die Realität ist, dass "Anwendungskontext" möglicherweise ein ziemlich irreführender Name ist, da app.app_context()
es sich um einen Kontext pro Anforderung handelt , der genau dem "Anforderungskontext" entspricht . Stellen Sie sich das als "Anforderungskontext-Lite" vor, der nur erforderlich ist, wenn Sie einige der Variablen benötigen, für die normalerweise ein Anforderungskontext erforderlich ist, Sie jedoch keinen Zugriff auf ein Anforderungsobjekt benötigen (z. B. wenn Sie Batch-DB-Vorgänge in a ausführen Shell-Skript). Wenn Sie versuchen, den Anwendungskontext auf mehr als einen Anforderungskontext zu erweitern, fragen Sie nach Problemen. Anstelle meines obigen Tests sollten Sie stattdessen Code wie diesen mit Flask's Kontexten schreiben:
from flask import Flask, g
app = Flask(__name__)
with app.app_context():
print('in app context, before first request context')
print('setting g.foo to abc')
g.foo = 'abc'
print('g.foo should be abc, is: {0}'.format(g.foo))
with app.test_request_context():
print('in first request context')
print('g.foo should be None, is: {0}'.format(g.get('foo')))
print('setting g.foo to xyz')
g.foo = 'xyz'
print('g.foo should be xyz, is: {0}'.format(g.foo))
with app.test_request_context():
print('in second request context')
print('g.foo should be None, is: {0}'.format(g.get('foo')))
print('setting g.foo to pqr')
g.foo = 'pqr'
print('g.foo should be pqr, is: {0}'.format(g.foo))
Welches wird die erwarteten Ergebnisse geben:
in app context, before first request context
setting g.foo to abc
g.foo should be abc, is: abc
in first request context
g.foo should be None, is: None
setting g.foo to xyz
g.foo should be xyz, is: xyz
in second request context
g.foo should be None, is: None
setting g.foo to pqr
g.foo should be pqr, is: pqr
g
in 0.10 ersetzt werden soll. Andernfalls klingt es so, als würde viel Code einige abwegige Fehler entwickeln.