अगर हम फ्लास्क एप्लिकेशन ग्लोबल के लिए डॉक्स की जांच करते हैं, flask.g , यह कहता है:
केवल एक फ़ंक्शन से दूसरे फ़ंक्शन में एक अनुरोध के लिए मान्य डेटा साझा करने के लिए, एक वैश्विक चर पर्याप्त नहीं है क्योंकि यह थ्रेडेड वातावरण में टूट जाएगा। फ्लास्क आपको एक विशेष वस्तु . प्रदान करता है यह सुनिश्चित करता है कि यह केवल सक्रिय अनुरोध के लिए मान्य है और वह प्रत्येक अनुरोध के लिए अलग-अलग मान लौटाएगा।
यह एक थ्रेड-स्थानीय प्रॉक्सी (flask/globals.py . में) का उपयोग करके प्राप्त किया जाता है ):
g = LocalProxy(partial(_lookup_app_object, 'g'))
दूसरी बात जो हमें ध्यान में रखनी चाहिए वह यह है कि पायथन हमारे डेकोरेटर के पहले पास को "संकलन" चरण के दौरान, किसी भी अनुरोध के बाहर, या flask निष्पादित कर रहा है। आवेदन पत्र। इसका मतलब है key तर्क को 'shop_{}_style'.format(g.city.id) का मान दिया जाता है जब आपका आवेदन शुरू होता है (जब आपकी कक्षा को पार्स/सजाया जा रहा हो), flask . के बाहर अनुरोध संदर्भ।
लेकिन हम आसानी से flask.g तक पहुंचने में देरी कर सकते हैं एक आलसी प्रॉक्सी का उपयोग करके, जो कॉलबैक फ़ंक्शन के माध्यम से केवल उपयोग किए जाने पर मान प्राप्त करता है। आइए पहले से बंडल किए गए flask . का उपयोग करें , werkzeug.local.LocalProxy :
from werkzeug.local import LocalProxy
class ShopAreaAndStyleListAPI(Resource):
@redis_hash_shop_style(key=LocalProxy(lambda: 'shop_{}_style'.format(g.city.id)))
def get(self):
# if not found from redis, query from mysql
pass
सामान्य तौर पर (गैर-flask . के लिए या गैर-werkzeug ऐप्स), हम एक समान LazyProxy . का उपयोग कर सकते हैं ProxyTypes . से पैकेज।
इससे असंबंधित, आप अपने redis_hash_shop_style को भी ठीक करना चाहेंगे डेकोरेटर न केवल redis . से लाने के लिए , लेकिन लपेटे हुए f() को कॉल करके, यदि पुराना (या गैर-मौजूदा) मान को अपडेट (या बनाना) भी है जब उपयुक्त हो।