इस सूत्र में जानकारी के लिए एक परिशिष्ट के रूप में: मैं 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
जैसा कि theY4Kman ने ऊपर कहा है, "प्रत्येक अनुरोध एक नया अनुप्रयोग संदर्भ धक्का देता है"। और जैसा कि फ्लास्क डॉक्स कहते हैं , आवेदन का संदर्भ "अनुरोधों के बीच साझा नहीं किया जाएगा"। अब, जो स्पष्ट रूप से नहीं कहा गया है (हालांकि मुझे लगता है कि यह इन कथनों से निहित है), और मेरे परीक्षण से स्पष्ट रूप से पता चलता है, यह है कि आपको कभी भी एक आवेदन के संदर्भ में निहित कई अनुरोध संदर्भों को स्पष्ट रूप से नहीं बनाना चाहिए , क्योंकिflask.g
(और सह) doesn ' t का कोई जादू है जिससे यह संदर्भ के दो अलग-अलग "स्तरों" में काम करता है, अलग-अलग राज्यों में स्वतंत्र रूप से आवेदन और अनुरोध के स्तर पर मौजूद है।
क्योंकि वास्तविकता है कि "आवेदन संदर्भ" संभावित काफी भ्रामक नाम है app.app_context()
है एक प्रति-अनुरोध संदर्भ , के रूप में बिल्कुल वैसा ही "अनुरोध संदर्भ" । इसे एक "अनुरोध संदर्भ लाइट" के रूप में सोचें, केवल उस मामले में आवश्यक है जहां आपको कुछ ऐसे चर की आवश्यकता होती है जो सामान्य रूप से अनुरोध के संदर्भ की आवश्यकता होती है, लेकिन आपको किसी भी अनुरोध ऑब्जेक्ट तक पहुंचने की आवश्यकता नहीं है (जैसे जब बैच डीबी संचालन चल रहा है शेल स्क्रिप्ट)। यदि आप एक से अधिक अनुरोध संदर्भ को शामिल करने के लिए आवेदन संदर्भ का प्रयास करते हैं और बढ़ाते हैं, तो आप परेशानी पूछ रहे हैं। इसलिए, मेरे परीक्षण के बजाय, आपको फ्लास्क के संदर्भों के साथ इस तरह कोड लिखना चाहिए:
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 में बदलने के लिए किसी प्रकार के अनुरोध संदर्भ वस्तु को लागू करता है , अन्यथा ऐसा लगता है कि बहुत सारे कोड कुछ कुटिल कीड़े विकसित करना शुरू कर सकते हैं।