国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

(二十)Flask之上下文管理第一篇(粗糙縷一遍源碼)

這篇具有很好參考價值的文章主要介紹了(二十)Flask之上下文管理第一篇(粗糙縷一遍源碼)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

每篇前言:

  • ????作者介紹:【孤寒者】—CSDN全棧領(lǐng)域優(yōu)質(zhì)創(chuàng)作者、HDZ核心組成員、華為云享專家Python全棧領(lǐng)域博主、CSDN原力計劃作者

  • ????本文已收錄于Flask框架從入門到實戰(zhàn)專欄:《Flask框架從入門到實戰(zhàn)》
  • ????熱門專欄推薦:《Python全棧系列教程》、《Django框架從入門到實戰(zhàn)》、《爬蟲從入門到精通系列教程》、《前端系列教程》、《tornado一條龍+一個完整版項目》。
  • ?????本專欄面向廣大程序猿,為的是大家都做到Flask從入門到精通,穿插有很多實戰(zhàn)優(yōu)化點。
  • ????訂閱專欄后可私聊進一千多人Python全棧交流群(手把手教學(xué),問題解答); 進群可領(lǐng)取Python全棧教程視頻 + 多得數(shù)不過來的計算機書籍:基礎(chǔ)、Web、爬蟲、數(shù)據(jù)分析、可視化、機器學(xué)習(xí)、深度學(xué)習(xí)、人工智能、算法、面試題等。
  • ????加入我一起學(xué)習(xí)進步,一個人可以走的很快,一群人才能走的更遠!

(二十)Flask之上下文管理第一篇(粗糙縷一遍源碼),多種技術(shù)合集,flask,python,后端,上下文管理,Flask源碼分析

引子:

當(dāng)一個客戶端,比如瀏覽器,向 Flask 服務(wù)發(fā)起 HTTP 請求,它首先會被 Web 服務(wù)器(如 gunicorn 或 uWSGI)接收。這個 Web 服務(wù)器的任務(wù)不僅僅是接收請求,它還作為 Flask 應(yīng)用程序與外部環(huán)境之間的橋梁。

為了使 Web 服務(wù)器和 Python Web 應(yīng)用程序能夠“對話”,我們需要一個規(guī)范或者說是一個協(xié)議。這就是 WSGI,即 Web Server Gateway Interface。Flask 利用 Werkzeug 這一 WSGI 工具庫來滿足這個規(guī)范的需求。

現(xiàn)在,當(dāng)一個 HTTP 請求達到 Web 服務(wù)器,Werkzeug 會介入并起到關(guān)鍵作用。它的職責(zé)是從原始 HTTP 請求中提取出有意義的數(shù)據(jù),并將其轉(zhuǎn)化為 Flask 可以輕松操作的格式。這意味著,原始的請求數(shù)據(jù)如:

GET /index.html HTTP/1.1
Host: www.example.com

會被 Werkzeug 解析,并且轉(zhuǎn)化為 Flask 可以直接使用的請求對象,比如 flask.request。這樣,開發(fā)者可以輕松地訪問請求的各個部分,例如 headers、query parameters、body 等,無需深入了解底層的 HTTP 協(xié)議。

簡而言之,通過 WSGI 和 Werkzeug 的配合,當(dāng) HTTP 請求達到 Flask 應(yīng)用時,我們可以直觀、高效地處理它,使開發(fā)變得更為簡潔。

看源碼捋一下一個完整請求在Flask里整個生命周期都干了啥?

前面講過請求一旦到來,就會執(zhí)行app.__call__方法:

from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'hello world'


if __name__ == '__main__':
    app.__call__
    app.run()

進入__call__方法:

【需要注意的是:參數(shù)environ 已經(jīng)是一個經(jīng)過 WSGI 服務(wù)器處理后的字典,它包含了所有與 HTTP 請求相關(guān)的信息。即當(dāng)一個 HTTP 請求到達 WSGI 服務(wù)器時,服務(wù)器會解析這個請求,并將相關(guān)的信息轉(zhuǎn)化為 environ 字典中的一系列鍵值對!】

(拓展:start_response 是 WSGI 規(guī)范中定義的一個回調(diào)函數(shù),它的主要作用是設(shè)置響應(yīng)的狀態(tài)和 HTTP 頭部。當(dāng)你的應(yīng)用程序決定如何響應(yīng)請求時,它需要調(diào)用這個函數(shù)來開始發(fā)送響應(yīng))

(二十)Flask之上下文管理第一篇(粗糙縷一遍源碼),多種技術(shù)合集,flask,python,后端,上下文管理,Flask源碼分析

繼續(xù)進去:

(二十)Flask之上下文管理第一篇(粗糙縷一遍源碼),多種技術(shù)合集,flask,python,后端,上下文管理,Flask源碼分析

上面選中那一句實現(xiàn)了三個功能:

  1. 將WSGI處理之后的請求數(shù)據(jù)environ又處理了一遍;
  2. 設(shè)置session為None;
  3. 實現(xiàn)路由匹配(根據(jù)url找到對應(yīng)視圖函數(shù))。

下面扣源碼來證實~

進去request_context

(二十)Flask之上下文管理第一篇(粗糙縷一遍源碼),多種技術(shù)合集,flask,python,后端,上下文管理,Flask源碼分析

繼續(xù)進去:

  • 下圖第一個箭頭所指位置就是功能一:將WSGI處理之后的請求數(shù)據(jù)environ又處理了一遍。主要任務(wù)就是將 WSGI 提供的 environ 字典轉(zhuǎn)換為 Flask 可以更容易處理的請求對象(可以自己繼續(xù)進源碼去探究)
  • 下圖第二個箭頭所指位置就是功能二:設(shè)置session為None。

(二十)Flask之上下文管理第一篇(粗糙縷一遍源碼),多種技術(shù)合集,flask,python,后端,上下文管理,Flask源碼分析

而上圖最后一個箭頭所指位置就是功能三:實現(xiàn)路由匹配(后續(xù)深入講解)~

回到wsgi_app函數(shù),繼續(xù)下一句:

(二十)Flask之上下文管理第一篇(粗糙縷一遍源碼),多種技術(shù)合集,flask,python,后端,上下文管理,Flask源碼分析

進去:

(二十)Flask之上下文管理第一篇(粗糙縷一遍源碼),多種技術(shù)合集,flask,python,后端,上下文管理,Flask源碼分析

其他部分先不管,直接看上圖箭頭所指位置,是不是很眼熟?

  • 這部分就是Flask使用了自己實現(xiàn)的threading.local()對象!

進去_request_ctx_stack對象:

(二十)Flask之上下文管理第一篇(粗糙縷一遍源碼),多種技術(shù)合集,flask,python,后端,上下文管理,Flask源碼分析

進去LocalStack()對象:

(二十)Flask之上下文管理第一篇(粗糙縷一遍源碼),多種技術(shù)合集,flask,python,后端,上下文管理,Flask源碼分析

回退兩層:

下圖箭頭所指就是給ctx里的session賦值:

  • 下圖倒數(shù)第三行調(diào)用了應(yīng)用對象(通常是一個Flask應(yīng)用實例)的open_session方法,并傳入當(dāng)前的請求對象self.request。這個方法的目標(biāo)是從請求中提取會話數(shù)據(jù)(如果存在的話)并返回一個會話對象。
  • 如果open_session沒有返回一個有效的會話對象(例如,當(dāng)前請求可能是一個全新的請求,沒有任何之前的會話數(shù)據(jù)),那么self.session將為None。在這種情況下,代碼會調(diào)用make_null_session方法來創(chuàng)建一個新的、空的會話對象。這確保了self.session始終有一個有效的會話對象,無論是從請求中提取的還是新創(chuàng)建的空會話。

(二十)Flask之上下文管理第一篇(粗糙縷一遍源碼),多種技術(shù)合集,flask,python,后端,上下文管理,Flask源碼分析

回去繼續(xù)往下扒:

下圖箭頭所指就是Flask用于處理一個請求并返回相應(yīng)響應(yīng)的核心邏輯:

  • 當(dāng)一個HTTP請求到達Flask應(yīng)用時,它需要經(jīng)過一系列的處理步驟,如:預(yù)處理(前置處理),路由匹配,視圖函數(shù)處理,以及后處理(后置處理)等,然后最終得到一個HTTP響應(yīng)(response)。full_dispatch_request方法封裝了這整個流程。

(二十)Flask之上下文管理第一篇(粗糙縷一遍源碼),多種技術(shù)合集,flask,python,后端,上下文管理,Flask源碼分析

進去:

簡單講一下這個函數(shù)各語句功能:

  1. 觸發(fā)首次請求前的函數(shù):

    self.try_trigger_before_first_request_functions()
    

    這一行嘗試觸發(fā)任何注冊為“在第一個請求之前執(zhí)行”的函數(shù)。這些函數(shù)只會在應(yīng)用收到其第一個請求時執(zhí)行一次,通常用于一些應(yīng)用的初始化工作。

  2. 發(fā)送請求開始信號:

    request_started.send(self)
    

    這一行發(fā)送一個request_started信號。Flask使用信號來允許開發(fā)者在某些事件(如請求開始或結(jié)束)發(fā)生時執(zhí)行自定義代碼。

  3. 請求預(yù)處理:

    rv = self.preprocess_request()
    

    這一行調(diào)用preprocess_request方法來執(zhí)行任何注冊的請求預(yù)處理函數(shù),例如before_request鉤子。這些鉤子可以用于各種目的,如用戶身份驗證、設(shè)置數(shù)據(jù)庫連接等。

  4. 請求分發(fā):

    if rv is None:
        rv = self.dispatch_request()
    

    如果預(yù)處理函數(shù)沒有返回任何值(即返回None),則該代碼調(diào)用dispatch_request方法。dispatch_request方法的職責(zé)是根據(jù)當(dāng)前請求的URL找到對應(yīng)的路由和視圖函數(shù),并執(zhí)行它。

  5. 請求后處理:

    return self.finalize_request(rv)
    

    最后,無論請求處理過程中是否發(fā)生異常,finalize_request方法都會被調(diào)用。它負責(zé)執(zhí)行任何注冊的請求后處理函數(shù)(例如after_request鉤子)并返回最終的HTTP響應(yīng)。

綜上所述,full_dispatch_request方法封裝了Flask處理HTTP請求的整個流程,包括前后處理、路由分發(fā)、異常處理和最終響應(yīng)的創(chuàng)建。

(二十)Flask之上下文管理第一篇(粗糙縷一遍源碼),多種技術(shù)合集,flask,python,后端,上下文管理,Flask源碼分析

先進去preprocess_request()函數(shù):

【可以看到確實在執(zhí)行所有注冊的請求預(yù)處理函數(shù),例如before_request鉤子】

(二十)Flask之上下文管理第一篇(粗糙縷一遍源碼),多種技術(shù)合集,flask,python,后端,上下文管理,Flask源碼分析

回去一層,進去finalize_request()函數(shù):

(二十)Flask之上下文管理第一篇(粗糙縷一遍源碼),多種技術(shù)合集,flask,python,后端,上下文管理,Flask源碼分析

繼續(xù)進去:

(二十)Flask之上下文管理第一篇(粗糙縷一遍源碼),多種技術(shù)合集,flask,python,后端,上下文管理,Flask源碼分析

繼續(xù)進去:

重要部分:

  • self.session_interface 是Flask應(yīng)用中用于處理會話的接口。is_null_session方法檢查給定的會話(在這里是ctx.session)是否是一個空會話。如果不是一個空會話(也就是說,會話中包含了一些數(shù)據(jù)),那么條件判斷為真。
  • 當(dāng)條件判斷為真時,save_session方法將當(dāng)前的會話數(shù)據(jù)(ctx.session)保存到響應(yīng)中(response)。這通常涉及將會話數(shù)據(jù)加密并設(shè)置為一個Cookie,然后將該Cookie附加到HTTP響應(yīng)中。這樣,當(dāng)瀏覽器接收到這個響應(yīng)時,它會保存這個Cookie,并在后續(xù)的請求中將其發(fā)送回服務(wù)器。這使得服務(wù)器能夠識別并“記住”用戶之間的連續(xù)請求。

(二十)Flask之上下文管理第一篇(粗糙縷一遍源碼),多種技術(shù)合集,flask,python,后端,上下文管理,Flask源碼分析

回到最開始:

(二十)Flask之上下文管理第一篇(粗糙縷一遍源碼),多種技術(shù)合集,flask,python,后端,上下文管理,Flask源碼分析

繼續(xù)進去:

(二十)Flask之上下文管理第一篇(粗糙縷一遍源碼),多種技術(shù)合集,flask,python,后端,上下文管理,Flask源碼分析

繼續(xù)進去:

(二十)Flask之上下文管理第一篇(粗糙縷一遍源碼),多種技術(shù)合集,flask,python,后端,上下文管理,Flask源碼分析

看看_request_ctx_stack對象是啥呢?

(二十)Flask之上下文管理第一篇(粗糙縷一遍源碼),多種技術(shù)合集,flask,python,后端,上下文管理,Flask源碼分析

進去:

【threading.local()對象???:是的!】

(二十)Flask之上下文管理第一篇(粗糙縷一遍源碼),多種技術(shù)合集,flask,python,后端,上下文管理,Flask源碼分析

文末扯幾句:

本文較為粗糙地捋了一遍Flask最為核心部分(上下文管理)的源碼!
粗糙是粗糙,但味道沒有錯,仔細扣扣源碼~
后續(xù)幾篇文章會繼續(xù)細化這部分!文章來源地址http://www.zghlxwxcb.cn/news/detail-805531.html

到了這里,關(guān)于(二十)Flask之上下文管理第一篇(粗糙縷一遍源碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 無限上下文,多級內(nèi)存管理!突破ChatGPT等大語言模型上下文限制

    無限上下文,多級內(nèi)存管理!突破ChatGPT等大語言模型上下文限制

    目前,ChatGPT、Llama 2、文心一言等主流大語言模型,因技術(shù)架構(gòu)的問題上下文輸入一直受到限制,即便是Claude 最多只支持10萬token輸入,這對于解讀上百頁報告、書籍、論文來說非常不方便。 為了解決這一難題,加州伯克利分校受操作系統(tǒng)的內(nèi)存管理機制啟發(fā),提出了MemGPT。

    2024年02月06日
    瀏覽(26)
  • Python_上下文管理器

    Python_上下文管理器

    目錄 上下文管理器類 多上下文管理器 contextmanager實現(xiàn)上下文管理器 上下文管理器(context manager)是 Python 編程中的重要概念,用于規(guī)定某個對象的使用范圍。一旦進入或者離開該使用范圍,會有特殊操作被調(diào)用 (比如為對象分配或者釋放內(nèi)存)。它的語法形式是with...as... 為了確

    2024年02月11日
    瀏覽(23)
  • Python函數(shù)-上下文管理器

    上下文管理協(xié)議(Context Management Protocol):包含方法 enter () 和 exit (),支持該協(xié)議的對象要實現(xiàn)這兩個方法。 上下文管理器(Context Manager):支持上下文管理協(xié)議的對象,這種對象實現(xiàn)了__enter__() 和 exit () 方法。 上下文管理器定義執(zhí)行 with 語句時要建立的運行時上下文,負

    2024年02月12日
    瀏覽(21)
  • Zustand 和 React 上下文狀態(tài)管理

    Zustand 和 React 上下文狀態(tài)管理

    Zustand 是客戶端全局狀態(tài)管理的一個很棒的庫。它簡單、快速,并且包大小小。然而,有一件事我不一定喜歡它:這些 Store 是全局性的。 但這不是全局狀態(tài)管理的重點嗎?要使該狀態(tài)在您的應(yīng)用程序中隨處可用。不過當(dāng)我回顧過去幾年中使用 zustand 的情況時,我意識到,更多

    2024年04月25日
    瀏覽(22)
  • python 上下文管理器 with 語句

    上下文管理器 with 語句可以自動地分配和釋放資源。 這篇文章中介紹了文件讀寫的方法,每次讀取文件時要使用 open() 函數(shù)打開文件,使用結(jié)束后要用 close() 函數(shù)關(guān)閉文件。有時,我們會忘記關(guān)閉文件,或者打開了許多文件占用太多資源。使用上下文管理器 with 語句可以方便

    2023年04月09日
    瀏覽(29)
  • pymysql 上下文管理器控制事務(wù)提交和回滾

    示例: 從上面例子看出, 在with結(jié)構(gòu)進入時,事務(wù)開始begin 在with結(jié)構(gòu)退出時,會根據(jù)是否產(chǎn)生異常進行commit和rollback操作,并關(guān)閉連接

    2024年01月25日
    瀏覽(29)
  • Python高級語法:with語句和上下文管理器

    Python高級語法:with語句和上下文管理器

    1.文件操作說明: ①文件使用完后必須關(guān)閉。 ②因文件對象會占用操作系統(tǒng)的資源,并且操作系統(tǒng)同一時間能打開的文件數(shù)量也是有限的。 例如:? 2. 存在的安全隱患: ① 由于文件讀寫時都有可能產(chǎn)生IOError,一旦出錯,后面的f.close()就不會調(diào)用。 例如: 運行結(jié)果: 3.try…except…

    2024年02月04日
    瀏覽(23)
  • Python教程(27)——如何使用Python中的上下文管理器

    當(dāng)我們在編寫代碼時,經(jīng)常會遇到需要管理資源的情況,比如打開和關(guān)閉文件,如果遇到了一些異常情況,我們需要關(guān)閉資源,不然會導(dǎo)致資源泄露,雖然我們可以通過手動的方式來關(guān)閉,但如果有多個異常情況需要考慮的話,萬一不小心漏了一處,就芭比Q了。所以,如果有

    2024年02月19日
    瀏覽(24)
  • 【 Python 全棧開發(fā) - WEB開發(fā)篇 - 38 】property和上下文管理器

    Python 是一個簡潔而強大的編程語言,通過提供各種特性和工具,使開發(fā)人員能夠更高效地進行編程。其中一個非常有用的特性是 @property 裝飾器,它允許我們在類中定義屬性并自定義其行為。 @property 裝飾器用于將一個方法轉(zhuǎn)換為類的屬性。使用 @property 裝飾器,我們可以像訪

    2024年02月13日
    瀏覽(36)
  • 超長上下文處理:基于Transformer上下文處理常見方法梳理

    超長上下文處理:基于Transformer上下文處理常見方法梳理

    原文鏈接:芝士AI吃魚 目前已經(jīng)采用多種方法來增加Transformer的上下文長度,主要側(cè)重于緩解注意力計算的二次復(fù)雜度。 例如,Transformer-XL通過緩存先前的上下文,并允許隨著層數(shù)的增加線性擴展上下文。Longformer采用了一種注意力機制,使得token稀疏地關(guān)注遠距離的token,從而

    2024年02月13日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包