このスレッドの情報の補足として:私flask.g
も動作が少し混乱しましたが、いくつかの簡単なテストでそれを明確にすることができました。これが私が試したものです:
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))
そして、それはそれが与える出力です:
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
Y4Kmanが前述したように、「すべてのリクエストは新しいアプリケーションコンテキストをプッシュします」。また、Flaskのドキュメントにあるように、アプリケーションコンテキストは「リクエスト間で共有されません」。今、(私はそれがこれらのステートメントから暗示だと思うが)、明示的に何を述べておらず、どのような私の明確テストが示すように、あなたがすべきことである決して明示的に、一つのアプリケーションのコンテキスト内にネストされた複数の要求コンテキストを作成していないのでflask.g
(とコ)doesnの」アプリケーションと要求レベルで異なる状態が独立して存在する、コンテキストの2つの異なる「レベル」で機能する魔法がある。
現実には、「アプリケーションコンテキスト」であるため、潜在的に非常に誤解を招く名前でapp.app_context()
ある要求ごとのコンテキスト、とまったく同じ「要求コンテキスト」。「リクエストコンテキストライト」と考えてください。通常はリクエストコンテキストを必要とするいくつかの変数が必要であるが、リクエストオブジェクトにアクセスする必要がない場合にのみ必要です(たとえば、バッチDB操作をシェルスクリプト)。アプリケーションコンテキストを拡張して、複数のリクエストコンテキストを含めると、問題が発生します。したがって、上記の私のテストではなく、代わりに次のようなコードをFlaskのコンテキストで作成する必要があります。
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))
期待される結果が得られます。
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
して0.10で置き換えます。そうでなければ、多くのコードがいくつかの不正なバグの開発を開始するように思えます。