1.名詞解釋
鉤子函數(shù)是指在執(zhí)行函數(shù)和目標(biāo)函數(shù)之間掛載的函數(shù),框架開發(fā)者給調(diào)用方提供一個(gè)point-掛載點(diǎn),至于掛載什么函數(shù)由調(diào)用方?jīng)Q定。
@before_first_request
在對應(yīng)用程序?qū)嵗牡谝粋€(gè)請求之前注冊要運(yùn)行的函數(shù),只會運(yùn)行一次。
?
@before_request
在每個(gè)請求之前注冊一個(gè)要運(yùn)行的函數(shù),每一次請求都會執(zhí)行一次。
?
@after_request
在每個(gè)請求之后注冊一個(gè)要運(yùn)行的函數(shù),每次請求完成后都會執(zhí)行。需要接收一個(gè) Response 對象作為參數(shù),并返回一個(gè)新的 Response 對象,或者返回接收的 Response 對象。
?
@teardown_request
注冊在每一個(gè)請求的末尾,不管是否有異常,每次請求的最后都會執(zhí)行。
?
@context_processor
上下文處理器,返回的字典可以在全部的模板中使用。
?
@template_filter('upper')
增加模板過濾器,可以在模板中使用該函數(shù),后面的參數(shù)是名稱,在模板中用到。
?
@errorhandler(400)
發(fā)生一些異常時(shí),比如404,500,或者拋出異常(Exception)之類的,就會自動調(diào)用該鉤子函數(shù)。
1.發(fā)生請求錯(cuò)誤時(shí),框架會自動調(diào)用相應(yīng)的鉤子函數(shù),并向鉤子函數(shù)中傳入error參數(shù)。
2.如果鉤子函數(shù)沒有定義error參數(shù),就會報(bào)錯(cuò)。
3.可以使用abort(http status code)函數(shù)來手動終止請求拋出異常,如果要是發(fā)生參數(shù)錯(cuò)誤,可以abort(404)之類的。
?
@teardown_appcontext
不管是否有異常,注冊的函數(shù)都會在每次請求之后執(zhí)行。
flask 為上下文提供了一個(gè) teardown_appcontext 鉤子,使用它注冊的毀掉函數(shù)會在程序上下文被銷毀時(shí)調(diào)用,通常也在請求上下文被銷毀時(shí)調(diào)用。
比如你需要在每個(gè)請求處理結(jié)束后銷毀數(shù)據(jù)庫連接:app.teardown_appcontext 裝飾器注冊的回調(diào)函數(shù)需要接收異常對象作為參數(shù),當(dā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手動拋出相應(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)注【無量測試之道】公眾號,回復(fù)【領(lǐng)取資源】
Python編程學(xué)習(xí)資源干貨、
Python+Appium框架APP的UI自動化、
Python+Selenium框架Web的UI自動化、
Python+Unittest框架API自動化、
資源和代碼 免費(fèi)送啦~
文章下方有公眾號二維碼,可直接微信掃一掃關(guān)注即可。
備注:我的個(gè)人公眾號已正式開通,致力于測試技術(shù)的分享,包含:大數(shù)據(jù)測試、功能測試,測試開發(fā),API接口自動化、測試運(yùn)維、UI自動化測試等,微信搜索公眾號:“無量測試之道”,或掃描下方二維碼:
添加關(guān)注,讓我們一起共同成長!
本文摘自 :https://www.cnblogs.com/