Flask請(qǐng)求鉤子與上下文及異常處理分項(xiàng)精解
一、請(qǐng)求鉤子學(xué)習(xí)
介紹
1.為了讓每個(gè)視圖函數(shù)避免編寫重復(fù)功能的代碼,F(xiàn)lask提供了通用設(shè)施的功能,即請(qǐng)求鉤子。
2.請(qǐng)求鉤子是通過(guò)裝飾器的形式實(shí)現(xiàn),F(xiàn)lask支持如下四種請(qǐng)求鉤子:
請(qǐng)求鉤子是通過(guò)裝飾器的形式實(shí)現(xiàn),F(xiàn)lask支持如下四種請(qǐng)求鉤子:
1.before_first_request
- 在處理第一個(gè)請(qǐng)求前執(zhí)行
2.before_request
- 在每次請(qǐng)求前執(zhí)行
- 如果在某修飾的函數(shù)中返回了一個(gè)響應(yīng),視圖函數(shù)將不再被調(diào)用
3.after_request
- 如果沒有拋出錯(cuò)誤,在每次請(qǐng)求后執(zhí)行
- 接受一個(gè)參數(shù):視圖函數(shù)作出的響應(yīng)
- 在此函數(shù)中可以對(duì)響應(yīng)值在返回之前做最后一步修改處理
- 需要將參數(shù)中的響應(yīng)在此參數(shù)中進(jìn)行返回
4.teardown_request:
- 在每次請(qǐng)求后執(zhí)行
- 接受一個(gè)參數(shù):錯(cuò)誤信息,如果有相關(guān)錯(cuò)誤拋出
代碼示例:
from flask import * app=Flask(__name__) # 在第一次請(qǐng)求之前調(diào)用,可以在此方法內(nèi)部做一些初始化操作 @app.before_first_request def before_first_requests(): print('服務(wù)器第一次接受請(qǐng)求的時(shí)候執(zhí)行') # 在每一次請(qǐng)求之前調(diào)用,這時(shí)候已經(jīng)有請(qǐng)求了,可能在這個(gè)方法里面做請(qǐng)求的校驗(yàn) # 如果請(qǐng)求的校驗(yàn)不成功,可以直接在此方法中進(jìn)行響應(yīng),直接return之后那么就不會(huì)執(zhí)行視圖函數(shù) @app.before_request def before_request(): print('每次視圖函數(shù)執(zhí)行之前執(zhí)行') #如果有return,后面的視圖函數(shù)就不執(zhí)行了 #return "提前結(jié)束“ # if 請(qǐng)求不符合條件: # return "laowang" # 在執(zhí)行完視圖函數(shù)之后會(huì)調(diào)用,并且會(huì)把視圖函數(shù)所生成的響應(yīng)傳入,可以在此方法中對(duì)響應(yīng)做最后一步統(tǒng)一的處理 @app.after_request def after_request(resp): print('每次視圖函數(shù)執(zhí)行之后執(zhí)行') return resp # 每一次請(qǐng)求之后都會(huì)調(diào)用,會(huì)接受一個(gè)參數(shù),參數(shù)是服務(wù)器出現(xiàn)的錯(cuò)誤信息 @app.teardown_request def teardown_request(resp): print('請(qǐng)求結(jié)束時(shí)執(zhí)行!') @app.route('/test1') def test1(): return "請(qǐng)求開始" @app.route('/test2') def test2(): return "請(qǐng)求鉤子結(jié)束" if __name__ == '__main__': app.run() '''contex_processor: 當(dāng)項(xiàng)目中的所有模板都需要一個(gè)參數(shù)的時(shí)候,可以在context_processor鉤子函數(shù)定義,并且自動(dòng)傳給所有模板,該函數(shù)一定要返回字典 '''
第一次執(zhí)行:
第二次執(zhí)行
1、通過(guò)對(duì)比可以發(fā)現(xiàn)第二次執(zhí)行時(shí),@app.before_first_request 裝飾器并沒有執(zhí)行,因?yàn)樵诘谝淮握{(diào)用時(shí),就已經(jīng)把準(zhǔn)備工作做好。
2、它的工作如 在請(qǐng)求開始時(shí),建立數(shù)據(jù)庫(kù)連接; 在請(qǐng)求開始時(shí),根據(jù)需求進(jìn)行權(quán)限校驗(yàn);
二、上下文
1.介紹
上下文:即語(yǔ)境,語(yǔ)意,在程序中可以理解為在代碼執(zhí)行到某一時(shí)刻時(shí),根據(jù)之前代碼所做的操作以及下文即將要
執(zhí)行的邏輯,可以決定在當(dāng)前時(shí)刻下可以使用到的變量,或者可以完成的事情。
Flask中有兩種上下文,請(qǐng)求上下文和應(yīng)用上下文
Flask中上下文對(duì)象:相當(dāng)于一個(gè)容器,保存了 Flask 程序運(yùn)行過(guò)程中的一些信息。
2.請(qǐng)求上下文
思考:在視圖函數(shù)中,如何取到當(dāng)前請(qǐng)求的相關(guān)數(shù)據(jù)?
比如:請(qǐng)求地址,請(qǐng)求方式,cookie等等
在 flask 中,可以直接在視圖函數(shù)中使用 request 這個(gè)對(duì)象進(jìn)行獲取相關(guān)數(shù)據(jù),而 request 就是請(qǐng)求上下文的對(duì)象,保存了當(dāng)前本次請(qǐng)求的相關(guān)數(shù)據(jù),請(qǐng)求上下文對(duì)象有:request、session
request
封裝了HTTP請(qǐng)求的內(nèi)容,針對(duì)的是http請(qǐng)求。舉例:user = request.args.get(‘user’),獲取的是get請(qǐng)求的參數(shù)。
session
用來(lái)記錄請(qǐng)求會(huì)話中的信息,針對(duì)的是用戶信息。舉例:session[‘name’] = user.id,可以記錄用戶信息。還可以通過(guò)session.get('name’獲取用戶信息。
3.應(yīng)用上下文
它的字面意思是 應(yīng)用上下文,但它不是一直存在的,它只是request context 中的一個(gè)對(duì) app 的代理(人),所謂
local proxy。它的作用主要是幫助 request 獲取當(dāng)前的應(yīng)用,它是伴 request 而生,隨 request 而滅的。
應(yīng)用上下文對(duì)象有:current_app,g
current_app
應(yīng)用程序上下文,用于存儲(chǔ)應(yīng)用程序中的變量,可以通過(guò)current_app.name打印當(dāng)前app的名稱,也可以在
current_app中存儲(chǔ)一些變量,例如:
應(yīng)用的啟動(dòng)腳本是哪個(gè)文件,啟動(dòng)時(shí)指定了哪些參數(shù)
加載了哪些配置文件,導(dǎo)入了哪些配置
連了哪個(gè)數(shù)據(jù)庫(kù)
有哪些public的工具類、常量
應(yīng)用跑再哪個(gè)機(jī)器上,IP多少,內(nèi)存多大
注意:
current_app 就是當(dāng)前運(yùn)行的flask app,在代碼不方便直接操作flask的app對(duì)象時(shí),可以操作current_app就等 價(jià)于操作flask app對(duì)象
代碼示例
from flask import Flask, current_app app= Flask(__name__) # 以ywx客戶端對(duì)象為例 # 用字符串表示創(chuàng)建的ywx客戶端 # 為了方便在各個(gè)視圖中使用,將創(chuàng)建的ywx客戶端對(duì)象保存到flask app中, # 后續(xù)可以在視圖中使用current_app.ywx獲取 app.ywx = 'hello flask' @app.route('/test') def test(): return current_app.ywx if __name__ == '__main__': app.run()
客戶端請(qǐng)求界面:
4.G對(duì)象
- g 作為 flask 程序全局的一個(gè)臨時(shí)變量,充當(dāng)中間媒介的作用,我們可以通過(guò)它在一次請(qǐng)求調(diào)用的多個(gè)函數(shù)間傳遞一些數(shù)據(jù)。
- 每次請(qǐng)求都會(huì)重設(shè)這個(gè)變量。
g對(duì)象可以結(jié)合前面學(xué)的藍(lán)圖來(lái)使用(感興趣的可以去看前面章節(jié)flask 藍(lán)圖學(xué)習(xí))
在藍(lán)圖包中創(chuàng)建一個(gè)新的藍(lán)圖:
在創(chuàng)建定義 g變量py文件。
3. 在整個(gè)項(xiàng)目里面建一個(gè)調(diào)用g變量的py文件
4. 在應(yīng)用程序中調(diào)用g變量
5. 在服務(wù)器端可以訪問(wèn)得到
在瀏覽器端界面
三、異常處理
1.HTTP異常主動(dòng)拋出
abort 方法
拋出一個(gè)給定狀態(tài)代碼的 HTTPException 或者 指定響應(yīng),例如想要用一個(gè) 頁(yè)面未找到異常來(lái)終止請(qǐng) 求,你可以調(diào)用 abort(404)。
參數(shù):
code – HTTP的錯(cuò)誤狀態(tài)
abort(404)
abort(500)
拋出狀態(tài)碼的話,只能拋出 HTTP 協(xié)議的錯(cuò)誤狀態(tài)碼
2.捕獲錯(cuò)誤
errorhandler 裝飾器
注冊(cè)一個(gè)錯(cuò)誤處理程序,當(dāng)程序拋出指定錯(cuò)誤狀態(tài)碼的時(shí)候,就會(huì)調(diào)用該裝飾器所裝飾的方法
參數(shù):
code_or_exception – HTTP的錯(cuò)誤狀態(tài)碼或指定異
1.可以在templates下新建html報(bào)錯(cuò)文件,通過(guò)errorhandler 裝飾器 當(dāng)報(bào)指定的錯(cuò)誤時(shí),可以通過(guò)render_template函數(shù)。
2.將其報(bào)錯(cuò)信息跳轉(zhuǎn)到客戶端(瀏覽器)顯示
from flask import * app=Flask(__name__) @app.route('/') def hello_world(): 1/0 #接受一個(gè)請(qǐng)求參數(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()
請(qǐng)求出錯(cuò)時(shí)顯示自定義的報(bào)錯(cuò)信息!
自定義的html報(bào)錯(cuò)文件
到此這篇關(guān)于Flask請(qǐng)求鉤子與上下文及異常處理分項(xiàng)精解的文章就介紹到這了,更多相關(guān)Flask請(qǐng)求鉤子內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python使用pip成功導(dǎo)入庫(kù)后還是報(bào)錯(cuò)的解決方法(針對(duì)vscode)
最近在學(xué)爬蟲,但在使用Scrapy包時(shí),在終端通過(guò)pip裝好包以后,在pycharm中導(dǎo)入包時(shí),依然會(huì)報(bào)錯(cuò),下面這篇文章主要給大家介紹了關(guān)于python使用pip成功導(dǎo)入庫(kù)后還是報(bào)錯(cuò)的解決方法,需要的朋友可以參考下2022-07-07Python pandas 計(jì)算每行的增長(zhǎng)率與累計(jì)增長(zhǎng)率
這篇文章主要介紹了Python pandas 計(jì)算每行的增長(zhǎng)率與累計(jì)增長(zhǎng)率,文章舉例詳細(xì)說(shuō)明。需要的小伙伴可以參考一下2022-03-03梯度下降法介紹及利用Python實(shí)現(xiàn)的方法示例
梯度下降算法是一個(gè)很基本的算法,在機(jī)器學(xué)習(xí)和優(yōu)化中有著非常重要的作用,下面這篇文章主要給大家介紹了關(guān)于利用Python實(shí)現(xiàn)梯度下降法的相關(guān)資料,對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-07-07python 如何把docker-compose.yaml導(dǎo)入到數(shù)據(jù)庫(kù)相關(guān)條目里
這篇文章主要介紹了python 如何把docker-compose.yaml導(dǎo)入到數(shù)據(jù)庫(kù)相關(guān)條目里?下面小編就為大家介紹一下實(shí)現(xiàn)方式,一起跟隨小編過(guò)來(lái)看看吧2021-01-01Python中利用aiohttp制作異步爬蟲及簡(jiǎn)單應(yīng)用
asyncio可以實(shí)現(xiàn)單線程并發(fā)IO操作,是Python中常用的異步處理模塊。這篇文章主要介紹了Python中利用aiohttp制作異步爬蟲的相關(guān)知識(shí),需要的朋友可以參考下2018-11-11python實(shí)習(xí)總結(jié)(yeild,async,azwait和協(xié)程)
今天是Python實(shí)習(xí)的第一天,熟悉了環(huán)境,第一次使用macbook,氛圍還不錯(cuò),努力學(xué)習(xí)新知識(shí),希望本片文章能給你帶來(lái)幫助2021-10-10