Flask 的 請求擴展 與 中間件
阿新 • • 發佈:2018-10-29
rec found .get param 管道符 direct use code and
Flask 的 請求擴展 與 中間件
flask 可以通過 擴展(裝飾器)來實現類似於django 中間件的功能
類似於django 的中間件, 在執行視圖函數之前, 之後的執行某些功能
1 @app.before_first_request
執行一次,第一次請求結束,在第一批函數執行後 就不再執行(狀態改為False)
@app.before_first_request
def before_first_request1():
print(‘before_first_request1‘)
2 @app.before_request: process_request
在視圖函數執行前,按照順序依次執行(列表順序)
@app.before_request
def before_request1():
Request.nnn = 123
print(‘before_request1‘)
@app.before_request
def before_request2():
print(‘before_request2‘)
登錄驗證:
@user.before_request
def check(*args,**kwargs):
if request.path == ‘/login‘:
return None
elif session.get(‘user_info‘):
return None
else:
return redirect(‘/login‘)
3 @app.after_request: process_response
在視圖函數執行後,按照反序依次執行(列表逆序)
@app.after_request
def after_request1(response):
print(‘before_request1‘, response)
return response
@app.after_request
def after_request2(response):
print(‘before_request2‘, response)
return response
註意:請求被 before_request 攔截後,所有的 response會執行
另外:擴展可以只對 單獨的藍圖對象生效,也可以對全局的 app 都生效
4 @app.errorhandler(404) 定制錯誤信息
@app.errorhandler(404)
def page_not_found(error):
return render_template(‘404.html‘),404
5 定制模板方法 @app.template_global()裝飾器 @app.template_filter()裝飾器
@app.template_global()裝飾器
def func(a,b,c) --->> 全局temlate使用 {{func(a,b,c)}}
和 @app.template_filter()裝飾器
def func(a,b,c) --->> 全局temlate使用 {{a|filter(b,c)}} # 需要管道符
6 根據flask的請求入口,實現類似中間件的操作
class Middleware(object):
def __int__(self,old_wsgi_app):
self.old_wsgi_app = old_wsgi_app
def __call__(self, environ, start_response):
print(‘before‘)
ret = self.old_wsgi_app(environ, start_response)
print(‘after‘)
return ret
if __name__ == ‘__main__‘:
app.wsgi_app = Middleware(app.wsgi_app)
app.run()
Flask 的 請求擴展 與 中間件