2015-07-10 36 views
2

如何更新python線程內的燒瓶會話?下面的代碼引發此錯誤:在Python線程中使用燒瓶會話

*** RuntimeError:請求上下文的工作之外

from flask import session 
def test(ses): 
    ses['test'] = "test" 

@app.route('/test', methods=['POST', 'GET']) 
def mytest(): 
    t = threading.Thread(target=test, args=(session,)) 
    t.start() 

回答

1

當您執行t.start(),要創建執行的一個獨立的線程是不執行同步主線程以任何方式。

燒瓶session object僅在context of a particular HTTP request定義。

變量session是什麼意思在第二個線程(t)?

當執行t時,不能保證來自主線程的用戶請求仍然存在或處於可修改狀態。也許HTTP請求已經在主線程中完全處理完畢。

Flask檢測到您正在嘗試操作依賴於特定上下文的對象,並且您的代碼未在該上下文中運行。所以它引發了一個例外。

有多種方法可以將來自多個線程的輸出同步到單個請求上下文中,但是... 您究竟在此嘗試做什麼?

+0

在我的情況下,我想將函數「test」作爲一個線程運行,因爲它執行了很多操作,執行時間很長,我不想等待它完成,所以我只是運行將更新在會話變量中運行的進程的狀態的線程,並且將從會話變量中檢查(使用ajax調用)這些進程的狀態。換句話說,這個想法是做第一個ajax調用,不用等待響應就運行這些進程,並讓下一個ajax調用檢查狀態。 – alloyoussef

+0

這當然是可能的,但是您需要一種機制將後臺任務與主線程同步。我建議你從Miguel Grinberg的燒瓶教程中看看[使用線程示例的後臺任務](http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xi-email-support)。 –