Flask請求鉤子與上下文及異常處理分項精解
一、請求鉤子學(xué)習(xí)
介紹
1.為了讓每個視圖函數(shù)避免編寫重復(fù)功能的代碼,F(xiàn)lask提供了通用設(shè)施的功能,即請求鉤子。
2.請求鉤子是通過裝飾器的形式實現(xiàn),F(xiàn)lask支持如下四種請求鉤子:
請求鉤子是通過裝飾器的形式實現(xiàn),F(xiàn)lask支持如下四種請求鉤子:
1.before_first_request
- 在處理第一個請求前執(zhí)行
2.before_request
- 在每次請求前執(zhí)行
- 如果在某修飾的函數(shù)中返回了一個響應(yīng),視圖函數(shù)將不再被調(diào)用
3.after_request
- 如果沒有拋出錯誤,在每次請求后執(zhí)行
- 接受一個參數(shù):視圖函數(shù)作出的響應(yīng)
- 在此函數(shù)中可以對響應(yīng)值在返回之前做最后一步修改處理
- 需要將參數(shù)中的響應(yīng)在此參數(shù)中進行返回
4.teardown_request:
- 在每次請求后執(zhí)行
- 接受一個參數(shù):錯誤信息,如果有相關(guān)錯誤拋出
代碼示例:
from flask import *
app=Flask(__name__)
# 在第一次請求之前調(diào)用,可以在此方法內(nèi)部做一些初始化操作
@app.before_first_request
def before_first_requests():
print('服務(wù)器第一次接受請求的時候執(zhí)行')
# 在每一次請求之前調(diào)用,這時候已經(jīng)有請求了,可能在這個方法里面做請求的校驗
# 如果請求的校驗不成功,可以直接在此方法中進行響應(yīng),直接return之后那么就不會執(zhí)行視圖函數(shù)
@app.before_request
def before_request():
print('每次視圖函數(shù)執(zhí)行之前執(zhí)行')
#如果有return,后面的視圖函數(shù)就不執(zhí)行了
#return "提前結(jié)束“
# if 請求不符合條件:
# return "laowang"
# 在執(zhí)行完視圖函數(shù)之后會調(diào)用,并且會把視圖函數(shù)所生成的響應(yīng)傳入,可以在此方法中對響應(yīng)做最后一步統(tǒng)一的處理
@app.after_request
def after_request(resp):
print('每次視圖函數(shù)執(zhí)行之后執(zhí)行')
return resp
# 每一次請求之后都會調(diào)用,會接受一個參數(shù),參數(shù)是服務(wù)器出現(xiàn)的錯誤信息
@app.teardown_request
def teardown_request(resp):
print('請求結(jié)束時執(zhí)行!')
@app.route('/test1')
def test1():
return "請求開始"
@app.route('/test2')
def test2():
return "請求鉤子結(jié)束"
if __name__ == '__main__':
app.run()
'''contex_processor: 當(dāng)項目中的所有模板都需要一個參數(shù)的時候,可以在context_processor鉤子函數(shù)定義,并且自動傳給所有模板,該函數(shù)一定要返回字典 '''第一次執(zhí)行:

第二次執(zhí)行

1、通過對比可以發(fā)現(xiàn)第二次執(zhí)行時,@app.before_first_request 裝飾器并沒有執(zhí)行,因為在第一次調(diào)用時,就已經(jīng)把準(zhǔn)備工作做好。
2、它的工作如 在請求開始時,建立數(shù)據(jù)庫連接; 在請求開始時,根據(jù)需求進行權(quán)限校驗;
二、上下文
1.介紹
上下文:即語境,語意,在程序中可以理解為在代碼執(zhí)行到某一時刻時,根據(jù)之前代碼所做的操作以及下文即將要
執(zhí)行的邏輯,可以決定在當(dāng)前時刻下可以使用到的變量,或者可以完成的事情。
Flask中有兩種上下文,請求上下文和應(yīng)用上下文
Flask中上下文對象:相當(dāng)于一個容器,保存了 Flask 程序運行過程中的一些信息。
2.請求上下文
思考:在視圖函數(shù)中,如何取到當(dāng)前請求的相關(guān)數(shù)據(jù)?
比如:請求地址,請求方式,cookie等等
在 flask 中,可以直接在視圖函數(shù)中使用 request 這個對象進行獲取相關(guān)數(shù)據(jù),而 request 就是請求上下文的對象,保存了當(dāng)前本次請求的相關(guān)數(shù)據(jù),請求上下文對象有:request、session
request
封裝了HTTP請求的內(nèi)容,針對的是http請求。舉例:user = request.args.get(‘user’),獲取的是get請求的參數(shù)。
session
用來記錄請求會話中的信息,針對的是用戶信息。舉例:session[‘name’] = user.id,可以記錄用戶信息。還可以通過session.get('name’獲取用戶信息。
3.應(yīng)用上下文
它的字面意思是 應(yīng)用上下文,但它不是一直存在的,它只是request context 中的一個對 app 的代理(人),所謂
local proxy。它的作用主要是幫助 request 獲取當(dāng)前的應(yīng)用,它是伴 request 而生,隨 request 而滅的。
應(yīng)用上下文對象有:current_app,g
current_app
應(yīng)用程序上下文,用于存儲應(yīng)用程序中的變量,可以通過current_app.name打印當(dāng)前app的名稱,也可以在
current_app中存儲一些變量,例如:
應(yīng)用的啟動腳本是哪個文件,啟動時指定了哪些參數(shù)
加載了哪些配置文件,導(dǎo)入了哪些配置
連了哪個數(shù)據(jù)庫
有哪些public的工具類、常量
應(yīng)用跑再哪個機器上,IP多少,內(nèi)存多大
注意:
current_app 就是當(dāng)前運行的flask app,在代碼不方便直接操作flask的app對象時,可以操作current_app就等 價于操作flask app對象
代碼示例
from flask import Flask, current_app
app= Flask(__name__)
# 以ywx客戶端對象為例
# 用字符串表示創(chuàng)建的ywx客戶端
# 為了方便在各個視圖中使用,將創(chuàng)建的ywx客戶端對象保存到flask app中,
# 后續(xù)可以在視圖中使用current_app.ywx獲取
app.ywx = 'hello flask'
@app.route('/test')
def test():
return current_app.ywx
if __name__ == '__main__':
app.run()客戶端請求界面:

4.G對象
- g 作為 flask 程序全局的一個臨時變量,充當(dāng)中間媒介的作用,我們可以通過它在一次請求調(diào)用的多個函數(shù)間傳遞一些數(shù)據(jù)。
- 每次請求都會重設(shè)這個變量。
g對象可以結(jié)合前面學(xué)的藍圖來使用(感興趣的可以去看前面章節(jié)flask 藍圖學(xué)習(xí))
在藍圖包中創(chuàng)建一個新的藍圖:

在創(chuàng)建定義 g變量py文件。

3. 在整個項目里面建一個調(diào)用g變量的py文件

4. 在應(yīng)用程序中調(diào)用g變量

5. 在服務(wù)器端可以訪問得到

在瀏覽器端界面

三、異常處理
1.HTTP異常主動拋出
abort 方法
拋出一個給定狀態(tài)代碼的 HTTPException 或者 指定響應(yīng),例如想要用一個 頁面未找到異常來終止請 求,你可以調(diào)用 abort(404)。
參數(shù):
code – HTTP的錯誤狀態(tài)
abort(404)
abort(500)
拋出狀態(tài)碼的話,只能拋出 HTTP 協(xié)議的錯誤狀態(tài)碼
2.捕獲錯誤
errorhandler 裝飾器
注冊一個錯誤處理程序,當(dāng)程序拋出指定錯誤狀態(tài)碼的時候,就會調(diào)用該裝飾器所裝飾的方法
參數(shù):
code_or_exception – HTTP的錯誤狀態(tài)碼或指定異
1.可以在templates下新建html報錯文件,通過errorhandler 裝飾器 當(dāng)報指定的錯誤時,可以通過render_template函數(shù)。
2.將其報錯信息跳轉(zhuǎn)到客戶端(瀏覽器)顯示
from flask import *
app=Flask(__name__)
@app.route('/')
def hello_world():
1/0
#接受一個請求參數(shù)
name=request.args.get('name')
if name:
print(name)
else:
abort(500)
print('后面代碼不執(zhí)行')
return 'hello world!'
@app.errorhandler(404)
def error_ym(error):
print(error)
return render_template('404.html'),404
@app.errorhandler(500)
def error_sr(error):
print(error)
return render_template('500.html'),500
if __name__ == '__main__':
app.run()請求出錯時顯示自定義的報錯信息!

自定義的html報錯文件

到此這篇關(guān)于Flask請求鉤子與上下文及異常處理分項精解的文章就介紹到這了,更多相關(guān)Flask請求鉤子內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python使用pip成功導(dǎo)入庫后還是報錯的解決方法(針對vscode)
最近在學(xué)爬蟲,但在使用Scrapy包時,在終端通過pip裝好包以后,在pycharm中導(dǎo)入包時,依然會報錯,下面這篇文章主要給大家介紹了關(guān)于python使用pip成功導(dǎo)入庫后還是報錯的解決方法,需要的朋友可以參考下2022-07-07
python 如何把docker-compose.yaml導(dǎo)入到數(shù)據(jù)庫相關(guān)條目里
這篇文章主要介紹了python 如何把docker-compose.yaml導(dǎo)入到數(shù)據(jù)庫相關(guān)條目里?下面小編就為大家介紹一下實現(xiàn)方式,一起跟隨小編過來看看吧2021-01-01
Python中利用aiohttp制作異步爬蟲及簡單應(yīng)用
asyncio可以實現(xiàn)單線程并發(fā)IO操作,是Python中常用的異步處理模塊。這篇文章主要介紹了Python中利用aiohttp制作異步爬蟲的相關(guān)知識,需要的朋友可以參考下2018-11-11
python實習(xí)總結(jié)(yeild,async,azwait和協(xié)程)
今天是Python實習(xí)的第一天,熟悉了環(huán)境,第一次使用macbook,氛圍還不錯,努力學(xué)習(xí)新知識,希望本片文章能給你帶來幫助2021-10-10

