flask為多個接口添加同一個攔截器的方法


前言

最近又抽掉出來寫一個 Python 項目, 框架使用 Flask , 又有些新心得, 比如本篇所說, 想要將某個藍圖加上統一的權限控制, 比如 admin 藍圖全部有一個統一的攔截器判斷是否有權限操作, 這里記錄兩個方法, 有利有弊

正文

使用 before_request 鈎子

http://docs.jinkan.org/docs/flask/reqcontext.html?highlight=before_request#callbacks-and-errors

flask提供了幾個鈎子, 在不同情況下觸發, 比如 before_request 鈎子, 在每次請求進入正式的 view 前執行, 如果在這個過程中 return 則直接返回, before_request 鈎子適用於 flask 的 app 對象, 也就是說可以為 flask 的一個最大的 app 創建全局的鈎子, 但是我們的目的是為 admin 藍圖去做攔截校驗, 因為藍圖的 bp 也是 app 所以我們也可以為單獨的藍圖綁定鈎子

效果如下

繼承 MethodView

Flask 的即插視圖類似於 Django ,使用類的方式來編寫 view, 讓我們可以使用 restful 的方式來編寫接口

http://docs.jinkan.org/docs/flask/views.html

那么我們之前使用函數式編寫接口時可以使用 裝飾器 來達到執行某個邏輯前的校驗, 在 即插視圖 中也提供了這樣的功能

http://docs.jinkan.org/docs/flask/views.html#id5

注冊 decorators ,他的值是一個可迭代的類型, 請求會依次執行里面注冊的函數, 執行完才執行邏輯代碼, 類似於

但是我們的需求是某個藍圖下的所有接口都有一個統一的攔截器, 難道需要我們每一個視圖都注冊攔截器嗎? 我們發現, 其實每個視圖都繼承了一個 MethodView 類, 我們是否可以使用繼承的方式來解決呢? 肯定可以啊

於是代碼修改為

以后需要使用該攔截器的視圖都繼承該自寫的視圖即可

需要注意的是: 如果裝飾視圖有多個, 比如

decorators = [cweVerify, admin_login_required]

那么其執行順序是 admin_login_required > cweVerify 是反着來的, 這一點需要注意

另外, 該方法也可以使用 g 對象, 但是注意, 在即插視圖中, 只有進入到請求的生命周期中才可以使用 g 對象

錯誤:

正確:


免責聲明!

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



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