哈嘍大家好,我是咸魚,今天我們來聊聊什么是 Flask 背景關系
咸魚在剛接觸到這個概念的時候腦子里蹦出的第一個詞是 CPU 背景關系
今天咸魚希望通過這篇文章,讓大家能夠對 Flask 背景關系設計的初衷以及應用有一個基本的了解
Flask 背景關系
我們在使用 Flask 開發 web 程式的時候,通常會面臨下面的情況

假設同一時間內有三臺客戶端(或瀏覽器)向 web 服務器發送了請求,那么 Flask 應用是如何分辨出這三個請求屬于哪臺客戶端(或瀏覽器)并回傳正確的回應的呢?
聰明的你結合文章題目很快就想到了——Flask 背景關系
在 Flask 中,通過本地執行緒技術來實作背景關系隔離,本地執行緒是一種輕量級的執行緒,它可以在同一個行程中創建多個執行緒,并且每個執行緒擁有獨立的堆疊和暫存器等資源,因此可以并發地執行多個任務
1、接收到請求的時候,Flask 會為每個請求創建一個 Flask 背景關系物件,這個背景關系物件包含了一些全域或者請求級別的變數
2、處理請求的時候,Flask 會為這個請求的背景關系物件分配或創建一個本地執行緒,這樣就可以在處理請求的各個環節當中通過本地執行緒來訪問這個請求的背景關系物件了
3、請求處理完畢之后,Flask 會將請求背景關系物件從當前執行緒中洗掉并銷毀,這樣就能保證每次請求都是獨立的,避免了執行緒安全問題
結合上面的例子我們得知,首先 Flask 應用會為這三個請求分配(或創建)到不同的執行緒中,然后創建與三個請求對應的三個 Flask 背景關系物件(應用背景關系和請求背景關系)并存盤到本地執行緒當中
到這里有小伙伴可能會問,Flask 應用是如何區分這三個請求背景關系的呢?
Flask 使用的背景關系是通過 werkzeug.local 模塊中的 Local 類實作的,Local 物件實際上是一個字典,它的鍵是執行緒 ID,值是該執行緒對應的背景關系物件
所以說,Flask 通過執行緒 ID 來區分不同的請求背景關系
兩種背景關系
現在我們知道了,Flask 會自動為每個請求創建一個專屬的獨一無二的環境,稱為背景關系
這個背景關系環境包含了一些全域級別和請求級別的變數,可以在請求處理的整個程序當中使用
也就是說,Flask 背景關系由兩部分組成——應用背景關系和請求背景關系

應用背景關系(application context)
當一個 Flask 應用啟動時,會自動創建一個應用背景關系物件,這個應用背景關系物件表示整個應用的運行環境,用于存盤應用全域的變數和配置(應用配置、資料庫連接資訊等)
對于每個請求來說,應用背景關系物件會在當前請求處理之前創建,并且會一直存在到請求處理完畢之后才被銷毀,這意味著,應用背景關系物件可以在整個請求生命周期內共享資料
請求背景關系(request context)
當請求到達 Flask 應用的時候,每一個請求都會有一個專屬的請求背景關系環境,用于存盤請求相關的變數和資訊(請求路徑、請求方法、請求引數等等)
應用背景關系和請求背景關系的區別
可以看到,應用背景關系是全域的,表示整個 Flask 應用的運行環境,而請求背景關系是針對每個請求獨立的,表示該請求的運行環境
在應用程式的整個生命周期中,應用背景關系只有一個,而且存在于應用的整個生命周期中,而請求背景關系會隨著請求的到來而動態創建和銷毀
對于每個請求來講,應用背景關系是每個請求共享的,請求背景關系是每個請求獨有的
舉個簡單的例子,比如說有一家大型超市(Flask 應用),每當有顧客來超市買東西的時候(相當于請求到達 Flask 應用),店員就會為每個顧客分配一個購物車(本地執行緒)
這個購物車里面存放了每個顧客的商品、折扣券(請求背景關系)等等,購物車里面的東西是每個顧客專屬的、獨有的(不同請求的請求背景關系是獨立的)
當顧客消費完畢之后,購物車里面的東西就會清空,店員就會回收這些購物車,等待分配給下一個顧客使用(請求處理完畢之后將請求背景關系物件從當前執行緒中洗掉并銷毀,并后續為新到的請求分配執行緒)
而這個超市里面的電梯、貨架以及商品(應用背景關系)都是每個顧客共享的(應用背景關系是每個請求共享的)
當超市關門的時候,電梯、貨架以及商品就不能夠對外使用了(應用背景關系存在于應用的生命周期中)
Flask 背景關系激活
Flask 背景關系可以分為自動激活和手動激活兩種方式
自動激活
自動激活是指 Flask 在處理請求時自動激活應用背景關系和請求背景關系,無需手動干預,這樣可以避免在代碼中頻繁手動創建和銷毀背景關系物件,使得代碼更加簡潔
下面這些情況中,Flask 會自動激活應用背景關系:
-
使用 flask run 命令啟動程式時
-
使用舊命令
app.run()啟動程式時 -
執行使用
@app.cli.command()裝飾器注冊 flask 命令時 -
使用 flask shell 命令啟動 python shell 時
當請求進入時,Flask 會自動激活請求背景關系
手動激活
在一些特殊情況下需要手動創建或激活背景關系物件
例如在使用 Flask 提供的測驗客戶端進行單元測驗時,需要手動創建應用背景關系和請求背景關系,并在測驗完成后手動銷毀,以保證測驗環境的隔離性
-
手動激活應用背景關系
在 Flask 中,手動激活應用背景關系可以通過使用 app.app_context() 背景關系管理器來實作

-
手動激活請求背景關系

總的來說,無論使用哪種方式,激活 Flask 背景關系的目的都是為了能夠在處理請求的程序中訪問請求背景關系,并且在請求處理完畢后,正確地銷毀請求背景關系
感謝閱讀,喜歡作者就動動小手[一鍵三連],這是我寫作最大的動力
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/550630.html
標籤:Python
上一篇:【0基礎學爬蟲】爬蟲基礎之自動化工具 Selenium 的使用
下一篇:返回列表
