2012-03-29 8 views
36

शुरू करते समय मैं फ्लास्क एप्लिकेशन के अंदर पाइथन में एक नया धागा शुरू करने की कोशिश कर रहा हूं। मैं पृष्ठभूमि कार्य कर रहा हूं जो अनुरोध से ट्रिगर हो जाता है, लेकिन मुझे अनुरोध का जवाब देने के लिए काम करने की प्रतीक्षा करने की आवश्यकता नहीं है।फसल फसल 'अनुरोध संदर्भ के बाहर काम कर रहा है' उप थ्रेड

क्या इस उप-खतरे में फ्लास्क अनुरोध को उस अनुरोध के लिए सेट करना संभव है? कारण, हमारे डीबी (एमओएनओडीबी के सामने मोंगोएन्गिन) पर हमारे प्रश्नों पर हमारा एसीएल अनुरोध के उपयोगकर्ता (यह फ्लास्क के अनुरोध ऑब्जेक्ट से इसे पकड़ता है) पर निर्भर करता है कि यह देखने के लिए कि क्या उनके पास ऑब्जेक्ट तक पहुंच है या नहीं, क्योंकि यह अनुरोध है उप-धागे में उपलब्ध नहीं है।

किसी भी विचार की बहुत सराहना की जाएगी।

यहां छद्म कोड है कि मैं इसे कैसे प्रबंधित कर रहा हूं, लेकिन यह काम नहीं कर रहा है।

@app.route('/my_endpoint', methods=['POST']) 
def my_endpoint_handler(): 
    #do tracking in sub-thread so we don't hold up the page 
    def handle_sub_view(req): 
     from flask import request 
     request = req 
     # Do Expensive work 
    thread.start_new_thread(handle_sub_view, (request)) 
    return "Thanks" 
+1

पारित आप केवल उपयोगकर्ता तो की जरूरत है क्यों नहीं बस उप-धागा में उपयोगकर्ता पारित कर सकते हैं? –

+0

फ्लास्क किसी भी समय अनुरोध तक पहुंच प्रदान करता है, इसलिए मेरे दस्तावेज़ बेस क्लास में एक क्वेरी सेट मैनेजर है जो अनुरोध से उपयोगकर्ता को पकड़ता है। मैं जो काम कर रहा हूं वह क्वेरी सेट मैनेजर की तुलना में बहुत अधिक स्तर है, इसलिए मैं केवल उपयोगकर्ता का उपयोग नहीं कर सकता – MattoTodd

+0

अनुरोध एक धागा/संदर्भ स्थानीय है इसलिए यह उपलब्ध नहीं है * किसी भी समय * अन्यथा आपको यह समस्या नहीं होगी । मुझे अभी भी लगता है कि आपको अनुरोध ऑब्जेक्ट पर निर्भरता को दोबारा देखना चाहिए। _any_ समय से –

उत्तर

44

एक test_request_context में अपने धागा कोड लपेटें तो आप context locals की पहुंच है:

@app.route('/my_endpoint', methods=['POST']) 
def my_endpoint_handler(): 
    #do tracking in sub-thread so we don't hold up the page 
    def handle_sub_view(req): 
     with app.test_request_context(): 
      from flask import request 
      request = req 
      # Do Expensive work 
    thread.start_new_thread(handle_sub_view, (request)) 
    return "Thanks" 

संपादित: यह उनका कहना है कि धागा मूल अनुरोध तुलना में एक अलग संदर्भ होगा लायक है। थ्रेड को फैलाने से पहले आपको उपयोगकर्ता आईडी जैसे किसी भी रोचक अनुरोध डेटा को निकालने की आवश्यकता है। फिर आप आईडी का उपयोग कर उप-धागे में एक (अलग) उपयोगकर्ता ऑब्जेक्ट ले सकते हैं। आप before_request हुक को चलाने के लिए आप सजाया समारोह के अंदर current_app.preprocess_request() कॉल करना होगा चाहते हैं http://flask.pocoo.org/docs/api/#flask.copy_current_request_context

:

+2

आप इसे बाहर निकालने में भी देखना चाहते हैं - http://celeryproject.org/ मैं इसे ईमेल भेजने जैसे संचालन को अवरुद्ध करने के लिए उपयोग करता हूं। अच्छी बात यह है कि आप बैंगएंड के रूप में mongoDB का उपयोग कर सकते हैं, इसलिए आपको अपने ढेर में कुछ भी जोड़ना नहीं होगा। – Ross

27

संस्करण 0.10 के बाद से ऐसा करने का एक समर्थित तरीका है।

4

आप इच्छित जानकारी को कॉपी करें और

@app.route('/my_endpoint', methods=['POST']) 
def my_endpoint_handler(): 
    #do tracking in sub-thread so we don't hold up the page 
    def handle_sub_view(data): 
     # Use the data in subprocess 
    data = request.get_json() # copy the data 
    thread.start_new_thread(handle_sub_view, data) 
    return "Thanks" 
+0

यह आसान नहीं है। मुझे ऐप के बारे में सभी डेटा कॉपी करना होगा। – jamlee

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