主頁 > 後端開發 > Flask 背景關系是什么 ?

Flask 背景關系是什么 ?

2023-04-21 07:40:08 後端開發

哈嘍大家好,我是咸魚,今天我們來聊聊什么是 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/550636.html

標籤:其他

上一篇:【0基礎學爬蟲】爬蟲基礎之自動化工具 Selenium 的使用

下一篇:返回列表

標籤雲
其他(157679) Python(38083) JavaScript(25376) Java(17984) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Flask 背景關系是什么 ?

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

    uj5u.com 2023-04-21 07:40:08 more
  • 【0基礎學爬蟲】爬蟲基礎之自動化工具 Selenium 的使用

    大資料時代,各行各業對資料采集的需求日益增多,網路爬蟲的運用也更為廣泛,越來越多的人開始學習網路爬蟲這項技術,K哥爬蟲此前已經推出不少爬蟲進階、逆向相關文章,為實作從易到難全方位覆寫,特設【0基礎學爬蟲】專欄,幫助小白快速入門爬蟲,本期為自動化工具 Selenium 的使用。 概述 目前,很多網站都 ......

    uj5u.com 2023-04-21 07:39:47 more
  • 關于Java中方法多載和方法重寫

    方法重寫是子類繼承父類(默認繼承Object類)后覆寫父類的方法 需要保證同名 同參 同回傳值 且訪問權限范圍不能縮小(public>protected>default>private) public class Father{ public int method(){ return -1; } } ......

    uj5u.com 2023-04-21 07:39:34 more
  • Go語言入門8(匿名函式 閉包)

    匿名函式 閉包 匿名函式 ? 顧名思義,就是沒有名字的函式。。。 func(){ fmt.Println("我就是匿名函式") } 匿名函式的兩種執行方法 將匿名函式賦給一個變數 定義后立即執行匿名函式 // 講匿名函式賦給一個變數 tmp := func(){ fmt.Println("我是匿名函 ......

    uj5u.com 2023-04-21 07:39:30 more
  • Opencv在VS2022中的配置(Python)

    下載Opencv 先去官網https://opencv.org/opencv-4-7-0/下載, 找到適合你設備的版本下載Windows就是Win pack,完成后進行安裝即可,一路同意默認就行,可以更改安裝位置,但路徑上盡可能以英文,以防止后面不必要的問題。 2.下載Python 首先是版本 發文 ......

    uj5u.com 2023-04-21 07:38:40 more
  • Django筆記二十六之資料庫函式之數學公式函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十六之資料庫函式之數學公式函式 這一篇來介紹一下公式函式,主要是數學公式。 其中 sin,cos 這種大多數情況下用不上的就不介紹了,主要介紹下面幾種: Abs() 絕對值 Ceil() 向上取整 Floor() 向下取整 Mod() ......

    uj5u.com 2023-04-21 07:38:29 more
  • Flask 背景關系是什么 ?

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

    uj5u.com 2023-04-21 07:33:10 more
  • 【0基礎學爬蟲】爬蟲基礎之自動化工具 Selenium 的使用

    大資料時代,各行各業對資料采集的需求日益增多,網路爬蟲的運用也更為廣泛,越來越多的人開始學習網路爬蟲這項技術,K哥爬蟲此前已經推出不少爬蟲進階、逆向相關文章,為實作從易到難全方位覆寫,特設【0基礎學爬蟲】專欄,幫助小白快速入門爬蟲,本期為自動化工具 Selenium 的使用。 概述 目前,很多網站都 ......

    uj5u.com 2023-04-21 07:26:10 more
  • 24道Python面試練習題

    1.簡述函式式編程 答:在函式式編程中,函式是基本單位,變數只是一個名稱,而不是一個存盤單元。除了匿名函式外,Python還使用fliter(),map(),reduce(),apply()函式來支持函式式編程。 2.什么是匿名函式,匿名函式有什么局限性 答:匿名函式,也就是lambda函式,通常用 ......

    uj5u.com 2023-04-21 07:25:58 more
  • python操作pptx設定title字體大小插入全屏圖片A4尺寸實體一枚

    pip install python-pptx 安裝好pptx,設定標題最大的作用是ppt里面的摘要視圖顯示摘要文字 參考:https://python-pptx.readthedocs.io/en/latest/ from pptx import Presentation from pptx.ut ......

    uj5u.com 2023-04-21 07:25:55 more