當(dāng)前位置:首頁(yè) > IT技術(shù) > 編程語(yǔ)言 > 正文

Python + Flask 常用的鉤子函數(shù)
2021-10-22 16:52:02

1.名詞解釋

鉤子函數(shù)是指在執(zhí)行函數(shù)和目標(biāo)函數(shù)之間掛載的函數(shù),框架開發(fā)者給調(diào)用方提供一個(gè)point-掛載點(diǎn),至于掛載什么函數(shù)由調(diào)用方?jīng)Q定。

@before_first_request

在對(duì)應(yīng)用程序?qū)嵗牡谝粋€(gè)請(qǐng)求之前注冊(cè)要運(yùn)行的函數(shù),只會(huì)運(yùn)行一次。

?

@before_request

在每個(gè)請(qǐng)求之前注冊(cè)一個(gè)要運(yùn)行的函數(shù),每一次請(qǐng)求都會(huì)執(zhí)行一次。

?

@after_request

在每個(gè)請(qǐng)求之后注冊(cè)一個(gè)要運(yùn)行的函數(shù),每次請(qǐng)求完成后都會(huì)執(zhí)行。需要接收一個(gè) Response 對(duì)象作為參數(shù),并返回一個(gè)新的 Response 對(duì)象,或者返回接收的 Response 對(duì)象。

?

@teardown_request

注冊(cè)在每一個(gè)請(qǐng)求的末尾,不管是否有異常,每次請(qǐng)求的最后都會(huì)執(zhí)行。

?

@context_processor

上下文處理器,返回的字典可以在全部的模板中使用。

?

@template_filter('upper')

增加模板過濾器,可以在模板中使用該函數(shù),后面的參數(shù)是名稱,在模板中用到。

?

@errorhandler(400)

發(fā)生一些異常時(shí),比如404,500,或者拋出異常(Exception)之類的,就會(huì)自動(dòng)調(diào)用該鉤子函數(shù)。

1.發(fā)生請(qǐng)求錯(cuò)誤時(shí),框架會(huì)自動(dòng)調(diào)用相應(yīng)的鉤子函數(shù),并向鉤子函數(shù)中傳入error參數(shù)。

2.如果鉤子函數(shù)沒有定義error參數(shù),就會(huì)報(bào)錯(cuò)。

3.可以使用abort(http status code)函數(shù)來手動(dòng)終止請(qǐng)求拋出異常,如果要是發(fā)生參數(shù)錯(cuò)誤,可以abort(404)之類的。

?

@teardown_appcontext

不管是否有異常,注冊(cè)的函數(shù)都會(huì)在每次請(qǐng)求之后執(zhí)行。

flask 為上下文提供了一個(gè) teardown_appcontext 鉤子,使用它注冊(cè)的毀掉函數(shù)會(huì)在程序上下文被銷毀時(shí)調(diào)用,通常也在請(qǐng)求上下文被銷毀時(shí)調(diào)用。

比如你需要在每個(gè)請(qǐng)求處理結(jié)束后銷毀數(shù)據(jù)庫(kù)連接:app.teardown_appcontext 裝飾器注冊(cè)的回調(diào)函數(shù)需要接收異常對(duì)象作為參數(shù),當(dāng)請(qǐng)求被正常處理時(shí)這個(gè)參數(shù)將是None,這個(gè)函數(shù)的返回值將被忽略。

?

2.代碼演示

常見的 http status code: 
200 --OK 
302 --Move Temporarily 
400 --bad request 
401 --Unauthorized 
403 --forbidden 
404 --not found 
500 --interal server error 
 1 from flask import Flask,request,render_template,abort,jsonify
 2  
 3 app = Flask(name)
 4 error_list=[]
 5  
 6 @app.route('/')
 7 def index():
 8 ### print(1/0)
 9 ### abort(404) #我們可以使用flask.abort手動(dòng)拋出相應(yīng)的錯(cuò)誤
10     return render_template("index.html")
11  
12 @app.route('/user')
13 def user():
14     user_agent = request.headers.get("User-Agent")
15     return f"<h1>Hello World!</h1>
Hello World!{user_agent}"
16  
17 @app.route('/commit')
18 def commit():
19     return '<form action="/getUser" method="get">  ' 
20            '<input type="text" name="username" value="">  ' 
21            '<input type="submit" value="提交">  ' 
22            '</form>'

?

1 @app.before_first_request
2 def before_first_request():
3     print("call the before first request of function")

?

1 @app.before_request
2 def before_request():
3     print("call the before request of function")

?

1 @app.after_request
2 def after_request(response):
3     print("call the after request of function")
4     ### print(response.get_json())
5     ### print(response.data)
6     print(response.headers)
7     ### return jsonify({"a": 1})
8     return response

?

1 @app.teardown_request
2 def teardown_request(error):
3     print("call the teardown request of function")
4     print("the error is:",error)
5     error_list.append(error)

?

1 @app.teardown_appcontext
2 def teardown_appcontext(exception=None):
3     print("call the teardown appcontext of function")
4     if(exception is None):
5         print("None")
6     else:
7         print("the exception is:",exception)
8         ### db.close();
9         ### file.close()

?

1 @app.route("/get_error")
2 def get_error():
3     print(error_list)
4     return str(error_list)

?

1 @app.template_filter("update")
2 def upper_filter(str):
3     print("call the upper filter of function")
4     return str.upper()+" good good study"

?

1 @app.context_processor
2 def context_process():
3     print("call the context process of function")
4     content = 'flask context manager'
5     return dict(content=content)

?

1 @app.errorhandler(500)
2 def server_is_exception(error):
3     print("*"*100)
4     print(error)
5     return 'the server is exception',500

?

1 @app.errorhandler(404)
2 def page_not_found(error):
3     print("*" * 50)
4     print(error)
5     return 'This page does not exist',404
6  
7 if __name__ == __'main'__:
8     app.run()

?

備注:

在 Python 文件所在目錄創(chuàng)建一個(gè) templates 目錄, 放入 index.html 文件,文件內(nèi)容如下。

index.html文件內(nèi)容

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 <!--<h2>{{ content }}</h2>-->
 9 <h1>the content = {{ content |update }}</h1>
10 </body>
11 </html>

歡迎關(guān)注【無量測(cè)試之道】公眾號(hào),回復(fù)【領(lǐng)取資源】
Python編程學(xué)習(xí)資源干貨、
Python+Appium框架APP的UI自動(dòng)化、
Python+Selenium框架Web的UI自動(dòng)化、
Python+Unittest框架API自動(dòng)化、
資源和代碼 免費(fèi)送啦~
文章下方有公眾號(hào)二維碼,可直接微信掃一掃關(guān)注即可。

備注:我的個(gè)人公眾號(hào)已正式開通,致力于測(cè)試技術(shù)的分享,包含:大數(shù)據(jù)測(cè)試、功能測(cè)試,測(cè)試開發(fā),API接口自動(dòng)化、測(cè)試運(yùn)維、UI自動(dòng)化測(cè)試等,微信搜索公眾號(hào):“無量測(cè)試之道”,或掃描下方二維碼:


添加關(guān)注,讓我們一起共同成長(zhǎng)!

本文摘自 :https://www.cnblogs.com/

開通會(huì)員,享受整站包年服務(wù)立即開通 >