RuntimeError: आवेदन संदर्भ से कार्य बाहर। app.app_context साथ () इस मामले को सुलझाने नहीं

वोट
0

मैं एक बार उस पर प्रक्रियाओं काम का एक पूल होने का उपयोग करके लेने वाली पाश को चलाने के लिए कोशिश कर रहा हूँ pool.map। पाश जो मैं एक नया समारोह में रखा है ताकि मैं इसे pool.map को पारित कर सकते हैं एक दृश्य समारोह का एक हिस्सा है। लेकिन इस त्रुटि फेंकता है -

RuntimeError: आवेदन संदर्भ से कार्य बाहर।

यह आमतौर पर अर्थ यह है कि आप कार्यक्षमता कि किसी तरह से वर्तमान आवेदन वस्तु के साथ इंटरफेस करने के लिए आवश्यक का उपयोग करने का प्रयास किया। इस को हल करने के app.app_context साथ एक आवेदन संदर्भ की स्थापना ()। अधिक जानकारी के लिए दस्तावेज़ देखें।

मैं एक में विधि कॉल किया था with app.app_context()(उल्लेख किया यहाँ )। लेकिन त्रुटि दूर जाना नहीं था। कृपया मुझे बताओ कि मैं कैसे इस समस्या को हल कर सकते हैं।

@app.route('/some_url', methods= ['POST'])
def view_function ():
    start_time = time.time()
    data = request.get_json()
    a = round(data.get('a', '') * data.get('a', ''))
    b = round(data.get('b', '') * data.get('b', ''))
    c = round(data.get('c', '') * data.get('c', ''))
    d = round(data.get('d', '') * data.get('d', ''))

    a_id = select.get_id(data.get('property', ''), session['somedata'][1])
    some_list, a_ids, loc = AnotherClassInDifferentDir.get_list(a_id, session['somedata'][1])
    value = select.get_value(//some arguments)

यह मैं कहाँ बहु का उपयोग करें, और मैं जहां उपयोग कर रहा है with app.app_context():(यह एक ही समारोह का एक हिस्सा है, view_function) -

    with app.app_context():
        e = data.get('e', '')
        stuff = session['somedata'][1]
        pool = Pool(processes = 2)
        func = partial(loopTask,e, a_id, a_ids, a, b, c, d, loc, stuff)
        stuff_array = [(index, item) for index, item in enumerate(some_list)]
        print(stuff_array =, stuff_array)
        pool.map(func, stuff_array)
        pool.close()
        pool.join()

    print(--- %s seconds --- % (time.time() - start_time))
    return ''

def loopTask(e, a_ids, a, b, c, d, loc, stuff, stuff_item):

    index, s = stuff_item
    c_id = document_ids[index]
    done = AnotherClassInDifferentDir.work(s)
    f = AnotherClassInDifferentDir.more_work(done, a, b, c, d, loc)
    if f != '':
        update.update_work(//some arguments)
        g.cnxn.commit()
        if (moreDB.check(//some arguments) ==0):
            update.work(//some arguments)
            g.cnxn.commit()
    else:
        pass

मेरा मानना है कि g.cnxn.commit()इस मुद्दे के बाद से यह आवेदन संदर्भ द्वारा सामने आ रहा है खड़ी कर रहा है लेकिन मुझे यकीन नहीं कर रहा हूँ। कृपया सहायता कीजिए!

13/02/2020 को 22:03
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


1 जवाब

वोट
1

के रूप में बोतल में संकेत डॉक्स , एप्लिकेशन संदर्भ उपलब्ध एक अनुरोध जो क्या होता है जब है के बाहर नहीं है loopTaskएक अलग प्रक्रिया में चलाया जाता है। के लिए अपने app उदाहरण गुजर पर विचार करें loopTaskसमारोह और उसके अंतर्गत कोड के वर्गों का उपयोग करने वाले लपेट gब्लॉक के साथ अपने अंदर नाम स्थान वस्तु। वास्तव में जरूरत नहीं है withअपने की ब्लॉक के अंदर view_functionके बाद से अनुरोध के दौरान ऐप संदर्भ पहले से मौजूद है।

संपादित करें: क्योंकि हम हर अनुरोध करने से पहले एक डाटाबेस कनेक्शन सेट कर रहे हों चलो एक साथ मिला देना test_request_context। आप इसके बारे में अधिक पढ़ सकते हैं यहाँ । यह परीक्षण लेकिन हमारे प्रयोजनों के लिए, यह हमें पैदा की प्रक्रिया में एक डाटाबेस कनेक्शन है करने की अनुमति देंगे के लिए है।

def loopTask(e, a_ids, a, b, c, d, loc, stuff, stuff_item, app):  # added app parameter 

    index, s = stuff_item
    c_id = document_ids[index]

    with app.test_request_context('/some_url'):
        app.preprocess_request()  # triggers 'connect_to_database'

        done = AnotherClassInDifferentDir.work(s)
        f = AnotherClassInDifferentDir.more_work(done, a, b, c, d, loc)
        if f != '':
            update.update_work(//some arguments)
            g.cnxn.commit()
            if (moreDB.check(//some arguments) ==0):
                update.work(//some arguments)
                g.cnxn.commit()
        else:
            pass

यह तो इसका मतलब withके लिए ब्लॉक परिवर्तन:

    e = data.get('e', '')
    stuff = session['somedata'][1]
    pool = Pool(processes = 2)
    func = partial(loopTask,e, a_id, a_ids, a, b, c, d, loc, stuff, stuff_item)
    stuff_array = [(index, item) for index, item in enumerate(some_list)]
    print("stuff_array =", stuff_array)
    pool.map(func, (stuff_array, app))  # passing the `app` Flask instance here
    pool.close()
    pool.join()

इस चाल करना चाहिए लेकिन आदर्श रूप में, हम एक समारोह हम अपने में पुन: उपयोग कर सकते हैं में db कनेक्शन सेटअप करना चाहिए था loopTask। इस तरह, हम की जरूरत नहीं होगी test_request_contextऔर प्रयोग app_contextके बजाय।

13/02/2020 को 22:41
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more