flask從客戶端收到請求時,要讓檢視函式能訪問請求物件request ,才能處理請求。我們可以將request物件作為引數傳到試圖函式裡,比如:
from flask import flask, requestdef hello_world(request): # 在這裡將request物件作為引數傳進來
data = request.json
return 'hello world'
if __name__ == '__main__':
但是我們也可能會使用一些其他物件,這樣傳來傳去,不僅影響簡潔,而且容易出錯。
為了解決這個問題,利用「請求上下文」,將request物件「當作」全域性變數,也就是這單個執行緒中是全域性變數,但是a執行緒的request物件只在a執行緒是全域性變數,在b執行緒就不是全域性變數,以此來保證請求物件不會混亂出錯
所以平時我們這樣寫就可以了 :
from flask import flask, requestdef hello_world():
data = request.json
return 'hello world'
if __name__ == '__main__':
也就是request物件只有單執行緒中才能被訪問,a執行緒就不能訪問b執行緒的request物件。比如我們用執行緒池實現非同步,子執行緒中的函式就不能訪問request物件,舉例:
from flask import flask,requestimport time
from concurrent.futures import threadpoolexecutor
executor = threadpoolexecutor(2)
def update_redis():
executor.submit(do_update) # 這裡我們開啟乙個執行緒,跑do_update
return 'hello world'
def do_update():
r_json = request # 程式會卡在這裡,因為子執行緒不能訪問主線程的request物件
time.sleep(5)
print('start update',r_json,type(request))
if __name__ == '__main__':
那麼我們如何解決這種問題呢,用最簡單的辦法,就是將主線程中的request物件作為引數傳給子執行緒中的函式中。舉例:
from flask import flask,requestimport time
from concurrent.futures import threadpoolexecutor
executor = threadpoolexecutor(2)
def update_redis():
r_json = request.json
executor.submit(do_update,(r_json)) # 將request物件的json資料作為引數,傳給子執行緒中的函式處理
return 'hello world'
def do_update(r_json):
time.sleep(3)
print('start update',r_json)
if __name__ == '__main__':
這樣就可以解決子執行緒無法訪問主線程的request物件的資料問題了。如果有更好的辦法,希望聯絡我,相互交流,共同進步。
flask之請求上下文
第一階段 將ctx request,session 放到local物件上 第二階段 檢視函式匯入 request session request.method localproxy物件.method,執行getattr方法,getattr self.get current object name s...
flask請求鉤子 請求上下文
from flask import flask from flask import redirect,url for,abort 在第一次請求之前呼叫,可以在當前的方法中初始化操作 def before first request print before first request 在每一次請求之...
Flask之請求上下文 應用上下文的概述
flask中有兩種上下文,請求上下文和應用上下文 一 請求上下文 request context request和session都屬於請求上下文物件。2.g 處理請求時,用於臨時儲存的物件,每次請求都會重設這個變數。比如 我們可以獲取一些臨時請求的使用者資訊。request 在每次http請求發生時...