Flask的各種裝飾器


效果類似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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM