一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 關于Flask 上下文詳細介紹

關于Flask 上下文詳細介紹

2022-03-08 00:20tigeriaf Python

這篇文章主要給大家分享了關于Flask 上下文詳細介紹,我們可以把上下文理解為當前環境的快照,是一個用來保存狀態的對象。在代碼執行的某個時刻,根據上下文的代碼邏輯,可以決定在當前時刻下使用到的環境變量等。下面一

關于Flask 上下文詳細介紹

1、上下文概念

上下文,說白了就是所謂的語境,就是語言環境。比如單獨拎出來一篇文章的某一句話,我們可能不能理解它的意思,但是通過這句話所處的語言環境,再結合它前后的語句,就能很輕易的理解。

我們可以把上下文理解為當前環境的快照,是一個用來保存狀態的對象。在代碼執行的某個時刻,根據上下文的代碼邏輯,可以決定在當前時刻下使用到的環境變量等。

2、Flask中的上下文

Flask 中有兩種上下文,應用上下文(application context)和請求上下文(request context):

  • application:指的是調用app = Flask(__name__)創建的 Flask 對象
  • request:指的是每次 HTTP 請求發生時,在 Flask 對象內部創建的 Request 對象

2.1請求上下文

Flask中處理請求時,應用會生成“請求上下文”對象,保存當前請求的相關數據信息,整個請求的處理過程,都會在這個上下文對象中進行,保證請求的處理過程獨立不受干擾。

請求上下文對象有:requestsession,下面以request為例具體講解。

在上篇文章Flask  請求鉤子的實現 我們說過,在 Flask 中有四種常用的請求鉤子,分別是:before_first_requestbefore_requestafter_requestteardown_request

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
@app.before_first_request
 
def before_first_request():
 
    print(request.url)
 
    print('before_first_request')
 
@app.before_request
 
def before_request():
 
    print(request.url)
 
    print('before_request')
 
 
 
 
 
@app.after_request
 
def after_request(response):
 
    print(request.url)
 
    print('after_request')
 
    return response
 
@app.teardown_request
 
def teardown_request(e):
 
    print(request.url)
 
    print('teardown_request')
 
@app.route('/test')
 
def test():
 
    print(request.url)
 
    return 'test'

關于Flask 上下文詳細介紹

通過請求我們發現,在每個請求鉤子裝飾的處理函數中,我們都可以直接訪問 request 對象。而且,在其他普通函數內,無法訪問 request 對象,說明 request 對象并不是真正的全局變量,只是在請求上下文的生命周期內可以訪問,離開了請求的生命周期,就無法訪問了。上面的請求鉤子裝飾的處理函數,在請求處理的不同階段執行,自然其內部也可以訪問 request 對象。

2.2應用上下文

上面說請求上下文是和請求相關,請求上下文對象保存的是請求的相關數據信息,下面說一下應用上下文,所謂應用上下文,就是和當前應用相關的,應用上下文對象是包含當前應用相關的信息。

應用上下文對象有:current_appg

我們了解到,每個請求,都有一個 request 對象和視圖函數對應,可以理解為當前請求(current request), 而程序也會有多個實例的情況,為了能獲取對應的程序實例,而不是固定的某一個程序實例,我們就需要使用 current_app變量。

?
1
2
3
4
5
6
7
8
9
from flask import Flask, current_app
 
app = Flask("tigeriaf_app")
 
@app.route('/')
 
def index():
 
    return 'Hello, {}!'.format(current_app.name)

current_app是一個本地代理,它的類型是werkzeug.local.LocalProxy,它所代理的即是app對象,也就是說current_app == LocalProxy(app)。所以通過current_app.name可以獲取當前應用的名稱,也就是tigeriaf_app,使用current_app是因為它也是一個ThreadLocal變量,對它的改動不會影響到其他線程。我們可以通過current_app._get_current_object()方法來獲取app對象。也可以在current_app中存儲一些自定義的變量。

current_app只在請求線程內存在,它的生命周期就是在應用上下文里。離開了應用上下文,current_app一樣無法使用。

g對象是 Flask 程序全局的一個臨時變量,充當中間媒介的作用。我們可以通過它傳遞一些數據,g保存的是當前請求的全局變量,每次請求都會重設這個值,我們通常會使用它結合請求鉤子來保存每個請求處理前所需要的全局變量,比如當前登入的用戶對象,數據庫連接等。 比如,使用g對象保存請求的 token,在視圖函數中就可以直接使用g.name獲取對應的值了。

?
1
2
3
4
5
6
7
from flask import g
 
@app.before_request
 
def get_token():
 
    g.name = request.headers.get("token")

到此這篇關于 關于Flask 上下文詳細介紹的文章就介紹到這了,更多相關Flask 上下文內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://juejin.cn/post/7031340663019044895

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 校园全肉高h湿一女多男 | 日韩视频在线免费 | 99精品在线视频观看 | videojapan日本孕交孕 | 校园春色自拍偷拍 | 免费370理论片中文字幕 | 久久精品热在线观看30 | 亚洲精品国产专区91在线 | 脱女学小内内摸出水网站免费 | 国产福利微拍精品一区二区 | 99精品国产美女福到在线不卡 | 激情综| 欧洲兽皇 | 国产成人精品.一二区 | 亚洲精品久久久992KVTV | 和直男装修工在工地啪 | 我与恶魔的h生活ova | 911精品国产亚洲日本美国韩国 | 99在线观看视频 | 国产成人影院一区二区 | 成人 在线欧美亚洲 | caonila国产在线观看 | 草草草在线 | 91赵邦贺| 国产亚洲女在线线精品 | 女八把屁股扒开让男生添 | 千金肉奴隶在线观看 | 国产一区二区三区四 | 九九九九在线视频播放 | 1769亚洲资源站365在线 | 国产免费大片 | 99精品视频在线观看免费 | bt7086新片速递亚洲最新合集 | 99久久6er热免费精品 | 火影忍者小南裸羞羞漫画 | 国产精品全国探花在线观看 | 日本伊人色综合网 | 国产精品天天在线 | 美女脱了内裤让男生玩屁股 | 惩罚狠h调教灌满 | 国内精品久久久久久久 |