flask中的4種全局變量


場景介紹

很多些時候,在做 flask 程序的時候,我們需要用到一些全局變量,比如用戶的登錄信息等
blog 中的搜索功能,需要在不同的頁面都顯示搜索,最笨的方法是每個頁面都實現一個搜索功能,但是這樣太重復,太繁瑣,違反了“簡單”原則。一個好的程序員會把重復的事情都模塊化,簡單化。
我們可以每個 url 都用到了同意同一個搜索功能。這需要我們用到一個全局的搜索功能。

全攬:

  • current_app # 當前激活程序的程序實例
  • g # 處理請求時用作臨時存儲的對象。每次請求會重設這個變量
  • request # 請求對象,封裝了客戶端發出的http請求中的內容
  • session # 用戶會話,用於存儲請求之間需要‘記住‘的值的詞典

圖解


盜圖了,改天我自己畫一張詳細的

一. g

1. 基本了解

g作為flask程序全局的一個臨時變量,充當者中間媒介的作用,我們可以通過它傳遞一些數據
從0.10開始g兌現就不是在request的級別,而是在應用上下文的級別。flask從0.10開始g是和app綁定在一起了。
但不同請求的AppContext是不同的,所以g還是不同。也就是說你不能再一個視圖中設置g.name,然后再另一個視圖中使用g.name,會提示AttributeError。

-- 注意:大多數代碼示例基於login函數,但是在實際項目中,給g賦值應基於登錄校驗的裝飾器函數,在不同請求中,g 並不是同一個 g;換言之,當前請求完全結束時,當前的 g 也就銷毀了 --

請求鈎子: 說到g變量,就不得不說鈎子函數

  1. before_first_request:注冊一個函數,在處理第一個請求之前運行;
  2. before_request:注冊一個函數,在每次請求之前運行;
  3. after_request:注冊一個函數,如果沒有未處理的異常拋出,在每次請求之后運行;
  4. teardown_request:注冊一個函數,即使有未處理的異常拋出,也在每次請求之后運行
    在請求鈎子函數和視圖函數之間共享數據一般使用上下文全局變量g。例如,before_request處理程序可以從數據庫中加載已登錄用戶,並將其保存到g.user中。隨后調用視圖函數時,視圖函數再使用g.user獲取用戶。

2. 實現原理

問題: 多線程的環境下,是如何保證request沒有混亂的?
參考: https://blog.csdn.net/yueguanghaidao/article/details/39533841

二. current_app

三. request

四. session

參考來自: https://blog.csdn.net/hyman_c/article/details/53512109


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM