Sebagai tambahan pada informasi di utas ini: Saya agak bingung dengan perilaku flask.g
juga, tetapi beberapa pengujian cepat telah membantu saya untuk mengklarifikasi hal itu. Inilah yang saya coba:
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))
Dan inilah output yang diberikannya:
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
Seperti kata Y4Kman di atas, "Setiap permintaan mendorong konteks aplikasi baru". Dan seperti yang dikatakan oleh Flask , konteks aplikasi "tidak akan dibagikan di antara permintaan". Sekarang, apa yang belum dinyatakan secara eksplisit (meskipun saya kira itu tersirat dari pernyataan ini), dan apa yang ditunjukkan oleh pengujian saya, adalah bahwa Anda tidak boleh secara eksplisit membuat beberapa konteks permintaan yang bersarang di dalam satu konteks aplikasi, karena flask.g
(dan co) tidak tidak memiliki keajaiban yang berfungsi dalam dua "level" konteks yang berbeda, dengan status berbeda yang ada secara independen di level aplikasi dan permintaan.
Kenyataannya adalah bahwa "aplikasi konteks" berpotensi cukup nama menyesatkan, karena app.app_context()
merupakan suatu konteks per-permintaan , persis sama dengan "permintaan konteks" . Anggap saja sebagai "lite konteks permintaan", hanya diperlukan dalam kasus di mana Anda memerlukan beberapa variabel yang biasanya memerlukan konteks permintaan, tetapi Anda tidak memerlukan akses ke objek permintaan apa pun (misalnya ketika menjalankan operasi batch DB dalam skrip shell). Jika Anda mencoba dan memperluas konteks aplikasi untuk mencakup lebih dari satu konteks permintaan, Anda meminta masalah. Jadi, daripada pengujian saya di atas, Anda sebaiknya menulis kode seperti ini dengan konteks 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))
Yang akan memberikan hasil yang diharapkan:
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
di 0,10, kalau tidak sepertinya banyak kode mungkin mulai mengembangkan beberapa bug yang licik.