Python Flask請求擴展與中間件相關(guān)知識總結(jié)
一、請求擴展
1.before_request
作用: 類比django中間件中的process_request,在請求到來執(zhí)行路由函數(shù)之前先執(zhí)行. 但是如果有多個順序是從上往下執(zhí)行.
應(yīng)用: 基于它做用戶登錄認證
注意: 如果before_request的返回值不是None的清空下, 返回的而是別的值, 那么后續(xù)的請求都不會執(zhí)行,本次請求直接返回, 如果定義了after_request那么會接著它執(zhí)行, 最終本次請求響應(yīng)結(jié)束.
@app.before_request def process_request(*args,**kwargs): if request.path == '/login': return None user = session.get('user_info') if user: return None return redirect('/login')
2.after_request
作用: 類比django中間件中的process_response,如果請求沒有出現(xiàn)異常的情況下, 會在請求返回return之前執(zhí)行. 但是如果有多個順序是從下往上執(zhí)行.
@app.after_request # 后執(zhí)行 def process_response1(response): print('process_response1 走了') return response @app.after_request # 先執(zhí)行 def process_response2(response): print('process_response2 走了') return response
3.before_first_request
作用: 項目啟動起來接收到第一次請求時執(zhí)行.
應(yīng)用: 項目初始化用來保證以后項目只要不重啟就不再繼續(xù)執(zhí)行.
@app.before_first_request def first(): print('我的第一次')
4. teardown_request
作用: 在每一個路由函數(shù)執(zhí)行完畢之后執(zhí)行,即使遇到了異常也會執(zhí)行. (提示: 返回reutrn沒有任何的效果, 不能控制返回的結(jié)果)
應(yīng)用: 記錄日志
@app.teardown_request def ter(e): # e就是上一個路由函授執(zhí)行過程中出現(xiàn)被捕獲的異常信息. print(e) print('我是teardown_request ')
5.errorhandler
作用: 綁定錯誤的狀態(tài)碼進而可以捕獲服務(wù)器的錯誤, 并返回對應(yīng)的錯誤頁面.
@app.errorhandler(500) def error_500(arg): return render_template('error.html', message='500錯誤') @app.errorhandler(404) def error_404(arg): return render_template('error.html', message='404錯誤')
6.template_global
作用: 全局的標簽, 在任意的html頁面中就可以直接使用, 不需要在render_template中傳遞參數(shù)以后才能使用.
@app.template_global() def sb(a1, a2): return a1 + a2 # html頁面中直接使用, 不需要傳遞參數(shù). {{ sb(1,2) }}
7.template_filter
@app.template_filter() def db(a1, a2, a3): return a1 + a2 + a3 # html頁面中直接使用, 不需要傳遞參數(shù). 其中1傳遞給a1, 2傳遞給a2, 3傳遞給a3. (提示: Django中的過濾器最多只可以傳遞二個參數(shù)) {{ 1|db(2,3) }}
總結(jié):
1.重點掌握before_request
和after_request
2.注意有多個的情況,執(zhí)行順序
3.before_request
請求攔截后(也就是有return值),response
所有都執(zhí)行
二、中間件
class Md(object): def __init__(self, old_wsgi_app): self.old_wsgi_app = old_wsgi_app def __call__(self, environ, start_response): print('開始之前') ret = self.old_wsgi_app(environ, start_response) print('結(jié)束之后') return ret if __name__ == '__main__': # 1. 我們發(fā)現(xiàn)當執(zhí)行app.run方法的時候,最終執(zhí)行run_simple,最后執(zhí)行app(),也就是在執(zhí)行app.__call__方法 # 2. 在__call__里面,執(zhí)行的是self.wsgi_app().那我們希望在執(zhí)行他本身的wsgi之前做點事情。 # 3. 所以我們先用Md類中__init__,保存之前的wsgi,然后我們用將app.wsgi轉(zhuǎn)化成Md的對象。 # 4. 那執(zhí)行新的的app.wsgi_app,就是執(zhí)行Md的__call__方法。 # 5. 最后把原來的wsgi_app替換為自定義的 app.wsgi_app = Md(app.wsgi_app) app.run()
到此這篇關(guān)于Python Flask請求擴展與中間件相關(guān)知識總結(jié)的文章就介紹到這了,更多相關(guān)Flask請求擴展與中間件內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。