效果類似django的process_request的裝飾器
1 @app.before_request 2 def before(*args,**kwargs): 3 print('請求之前') 4 ''' 5 如果允許通過訪問,可以return None 6 該裝飾器裝飾的函數如果有return其他內容則直接結束訪問, 7 效果有點類似django的process_reqeust中間件方法。 8 比如通過這個裝飾器寫登陸驗證,判斷其是否有session,沒有則不允許訪問,有則繼續訪問 9 然后通過request.path判斷訪問的函數,如果是登陸(白名單)則通過。 10 request.url 是完整的url 11 request.path是域名后面的url正則 12 ''' 13 if request.path == '/login': 14 return None 15 user = session.get('user_info') 16 if user: 17 return None 18 return redirect('/login')
類似process_response
1 @app.after_request 2 def after(response): 3 #效果和process_response是一樣的,必須有返回值,沒有則報錯。 4 print('我走了') 5 return response
flask中間件裝飾器執行順序。
如果多個app.before_request和app.after_request,
那么執行順序也和django類似,
app.before_request是按照從上而下執行(文件的上下),app.after_request是自下而上執行。
如果在app.before_request中return了其他內容,請求被攔截,那么不會執行視圖函數,
直接從最后一個app.after_reqeust倒着開始執行所有after_request。
自定義錯誤頁面:
1 @app.error_handlers(404) 2 def error_404(arg): 3 '''自定義錯誤頁面,根據狀態碼定制''' 4 return "404錯誤啦"
模板中定制方法:
前端直接調用后端函數的裝飾器:
1 @app.template_global() 2 def xx(a1,a2): 3 return a1+a2 4 ''' 5 這個裝飾器的作用就是,可以在前端直接通過{{ xx(1,2)}}來調用后端的這個函數。 6 '''
相當於filter的裝飾器
1 @app.template_filter() 2 def db(a1,a2,a3): 3 return a1+a2+a3 4 ''' 5 效果和django的Filter相似,前端渲染的時候需要注意寫法 6 {{ 1|db(2,3)}} 1是第一個參數,后面是2,3參數。 7 '''
第一次來請求操作的裝飾器:
1 @app.before_first_request 2 def first(*args,**kwargs): 3 pass 4 ''' 5 只有第一次請求時候才執行的函數裝飾器 6 '''
Flask的中間件一般感覺用處不大,不如裝飾器方便

通過重新復制app.wsgi_app,
重寫這個類的__call__方法,如上圖,只是增加了兩個打印,效果同process_request,process_response
