2017-11-20 22 views
12

के अंदर 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 उपयोग करने के लिए उम्मीद कर रहा था।

+0

gevent का उपयोग करते समय, क्या आपने पहले आयात के बाद सीधे बंदर पैच किया था? –

+0

हाँ, ऐसा लगता है जैसे मैंने अपने उदाहरण से बाहर छोड़ा। लेकिन हाँ, मैं अपने वास्तविक कोड में तुरंत 'gevent.monkey' से' patch_all' को कॉल कर रहा हूं। – jamesdarabi

+1

आरंभ करने के लिए, आप 'flask.g' ऑब्जेक्ट में' user_data' और 'more_user_data' क्यों स्टोर करना चाहते हैं? यदि आपको उपयोगकर्ता के अनुसार डेटा दृढ़ता की आवश्यकता है, तो 'flask.session' ऑब्जेक्ट है। और यदि आपको वैश्विक दृढ़ता की आवश्यकता है, तो आप उन्हें स्टोर करने के लिए किसी भी 'module.attribute' के बारे में उपयोग कर सकते हैं। –

उत्तर

6

flask.gbound with the app context है, अनुरोध संदर्भ पर नहीं, as the doc says:

Starting with Flask 0.10 this is stored on the application context and no longer on the request context ...

copy_current_request_context() केवल अनुरोध संदर्भ नकल है, लेकिन आप एक नए एप्लिकेशन संदर्भ दे। आप एक बना सकता है बंद के साथ वर्तमान एप्लिकेशन संदर्भ पारित करने के लिए:

def copy_current_app_context(f): 
    from flask.globals import _app_ctx_stack 
    appctx = _app_ctx_stack.top 
    def _(*args, **kwargs): 
     with appctx: 
      return f(*args, **kwargs) 
    return _ 

हालांकि, मैं तर्क है, जो क्लीनर है के माध्यम से स्पष्ट रूप से greenlet के पास डेटा पसंद करते हैं।

संबंधित मुद्दे