Redis
 sql >> डेटाबेस >  >> NoSQL >> Redis

अजगर फ्लास्क कैसे एक डेकोरेटर के लिए एक गतिशील पैरामीटर पारित करने के लिए

अगर हम फ्लास्क एप्लिकेशन ग्लोबल के लिए डॉक्स की जांच करते हैं, 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() को कॉल करके, यदि पुराना (या गैर-मौजूदा) मान को अपडेट (या बनाना) भी है जब उपयुक्त हो।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. मैं Django के साथ रेडिस का उपयोग कैसे कर सकता हूं?

  2. रेडिस रेंज द्वारा फ़िल्टर करें, सॉर्ट करें और पहले 10 लौटाएं

  3. स्प्रिंग डेटा रेडिस HGETALL ऑपरेशन

  4. redis.serializer.SerializationException को कैसे पकड़ें?

  5. ubuntu14.04 में रेडिस-सर्वर:बाइंड एड्रेस पहले से उपयोग में है