के अंदर flask.g एक्सेस करें मैं फ्लास्क + गीवेंट का उपयोग कर रहा हूं और flask.g
एप्लिकेशन ग्रीनलेट के लक्ष्य फ़ंक्शन के अंदर वैश्विक ग्लोबल एक्सेस करना चाहता हूं। मैं copy_current_request_context
डेकोरेटर उपयोग कर रहा हूँ और बहुत उदाहरण डॉक्स में दिए गए के समान एक स्थिति है:ग्रीनलेट
AttributeError: '_AppCtxGlobals' object has no attribute 'user_data'
मुझे लगता है कि एक नया आवेदन संदर्भ है:
import gevent
from flask import copy_current_request_context, g
@app.route('/')
def index():
g.user_data = 'foobar'
g.more_user_data = 'baz'
@copy_current_request_context
def do_some_work():
some_func(g.user_data, g.more_user_data)
...
gevent.spawn(do_some_work)
return 'Regular response'
हालांकि, मैं निम्नलिखित त्रुटि मिलती है जब अनुरोध संदर्भ की प्रतिलिपि बनाई जाती है तब धक्का दिया जाता है? मैंने फ्लास्क कोड here में एक ट्रेस सेट किया है और ऐसा लगता है कि यह मामला है। इसलिए त्रुटि आश्चर्यजनक नहीं है क्योंकि flask.g
ऑब्जेक्ट 0.10 के रूप में स्कॉप्ड अनुप्रयोग संदर्भ है (http://flask.pocoo.org/docs/0.12/api/#flask.Flask.app_ctx_globals_class देखें)।
जाहिर है, मैं तो बस उपयोगकर्ता डेटा लक्ष्य समारोह में तर्कों के रूप पारित कर सकते हैं:
import gevent
from flask import g
@app.route('/')
def index():
g.user_data = 'foobar'
g.more_user_data = 'baz'
def do_some_work(user_data, more_user_data):
some_func(user_data, more_user_data)
...
gevent.spawn(do_some_work, g.user_data, g.more_user_data)
return 'Regular response'
और यह सिर्फ ठीक काम करता है, लेकिन मैं यदि संभव हो तो flask.g
उपयोग करने के लिए उम्मीद कर रहा था।
gevent का उपयोग करते समय, क्या आपने पहले आयात के बाद सीधे बंदर पैच किया था? –
हाँ, ऐसा लगता है जैसे मैंने अपने उदाहरण से बाहर छोड़ा। लेकिन हाँ, मैं अपने वास्तविक कोड में तुरंत 'gevent.monkey' से' patch_all' को कॉल कर रहा हूं। – jamesdarabi
आरंभ करने के लिए, आप 'flask.g' ऑब्जेक्ट में' user_data' और 'more_user_data' क्यों स्टोर करना चाहते हैं? यदि आपको उपयोगकर्ता के अनुसार डेटा दृढ़ता की आवश्यकता है, तो 'flask.session' ऑब्जेक्ट है। और यदि आपको वैश्विक दृढ़ता की आवश्यकता है, तो आप उन्हें स्टोर करने के लिए किसी भी 'module.attribute' के बारे में उपयोग कर सकते हैं। –