python案例中Flask全局配置示例詳解
WEB服務(wù)全局配置
在目前的開發(fā)過市場(chǎng)當(dāng)中,有很多WEB服務(wù)框架,F(xiàn)lask只是其中之一,但是總體上來看,所有的WEB框架都是依據(jù)HTTP協(xié)議的邏輯從請(qǐng)求到響應(yīng)設(shè)計(jì)的。固然有很多功能是獨(dú)立的,但是也有一部分功能需要全局設(shè)定,比如安全校驗(yàn),比如埋點(diǎn)日志,那么這里就用到了全局配置。
所謂的全局配置,就是在框架全局,請(qǐng)求前后,響應(yīng)前后,設(shè)置的全局配置,比如登錄校驗(yàn),這個(gè)功能并不是針對(duì)單個(gè)頁面,而是針對(duì)所有頁面的操作,當(dāng)然可以一個(gè)頁面一個(gè)頁面的實(shí)現(xiàn),但是更好的辦法就是在請(qǐng)求進(jìn)入視圖之前,就開始校驗(yàn),這樣也可以降低服務(wù)器的部分壓力,那么這樣全局設(shè)置就是一個(gè)很好的方法。
Flask全局配置
flask 同樣也設(shè)置了全局的配置,常用的有以下兩種:
before_request
在請(qǐng)求之前執(zhí)行,一般用在對(duì)請(qǐng)求內(nèi)容的過濾的場(chǎng)景下。一般使用的時(shí)候需要結(jié)合flask本身的request方法。
默認(rèn)采用裝飾器的方式使用
from flask import Flask from flask import request app = Flask(__name__) @app.before_request def ip_filter(): black_list = [ "127.0.0.1" ] remote_addr = request.remote_addr #獲取請(qǐng)求用戶ip if remote_addr in black_list: return "Not Allowed",405 @app.route("/index") def index(): return "index" if __name__ == '__main__': app.run()
這個(gè)時(shí)候,如果采用本地ip訪問,就會(huì)返回405狀態(tài),拒絕訪問。
當(dāng)然也可以不采用裝飾器使用,其實(shí)原理上是一樣的:
類似代碼就全部注釋了,嘿嘿嘿
from flask import Flask from flask import request app = Flask(__name__) #.... app.before_request(ip_filter) #.... if __name__ == '__main__': app.run()
after_request
在請(qǐng)求處理完成執(zhí)行,這里可以對(duì)全局的響應(yīng)進(jìn)行配置,比如,全局設(shè)置json響應(yīng)格式,但是需要注意的是after_request的函數(shù)必須設(shè)置參數(shù)接收response對(duì)象,這個(gè)response對(duì)象就是視圖返回的的對(duì)象。
from flask import Flask app = Flask(__name__) @app.route("/index") def index(): return {"data": {"nav":["index","news_list"]},"message": "success", "error_code": 1} @app.after_request def after_request_fun(response): response_format = {"data": {},"message": "success", "error_code": 1} if response.content_type == "application/json": #如果返回?cái)?shù)據(jù)的類型是json json_data = response.json response_format.update(json_data) return response # app.after_request(after_request_fun) 第二種寫法 if __name__ == '__main__': app.run()
其他一些全局方法也列在這里吧:
方法 | 描述 |
---|---|
before_first_request | 服務(wù)器啟動(dòng)第一次請(qǐng)求之前執(zhí)行,一般初始化一些數(shù)據(jù)使用 |
teardown_request | 比較難理解,直接和請(qǐng)求上下文環(huán)境掛鉤. 只有在請(qǐng)求上下文被 pop 出請(qǐng)求棧的時(shí)候才會(huì)觸發(fā),需要先去看看flask請(qǐng)求上下文 |
errorhandler | 發(fā)生錯(cuò)誤時(shí)執(zhí)行,需要提前定義號(hào)錯(cuò)誤句柄,被觸發(fā)的前提是 view_function 中拋出了錯(cuò)誤 |
template_global | 前后端不分離,jinja2全局變量,比如用戶狀態(tài)可以設(shè)置在這里 |
template_filter | 之前聊過的全局jinja2過濾器 |
Flask自定義中間件
flask 支持通過自定義類來替換Flask本身的wsgi_app,當(dāng)然,簡(jiǎn)單的修改建議保留原來的wsgi_app對(duì)象
from flask import Flask app = Flask(__name__) @app.route("/index") def index(): return {"data": {"nav":["index","news_list"]},"message": "success", "error_code": 1} class MiddleWare: def __init__(self, old_wsgi_app): self.old_wsgi_app = old_wsgi_app def __call__(self, environ, start_response): print('類似before_request') ret = self.old_wsgi_app(environ, start_response) print('類似after_request') return ret if __name__ == '__main__': app.wsgi_app = MiddleWare(app.wsgi_app) app.run()
以上就是python案例中Flask全局配置示例詳解的詳細(xì)內(nèi)容,更多關(guān)于python Flask全局配置的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python實(shí)現(xiàn)敲擊木魚積累功德小項(xiàng)目
最近大家都很流行用手機(jī)敲擊電子木魚積累功德,這在很多短視頻中也常常見到。本文將用Python實(shí)現(xiàn)這一效果,感興趣的小伙伴可以了解一下2022-11-11python爬蟲爬取網(wǎng)頁數(shù)據(jù)并解析數(shù)據(jù)
這篇文章主要介紹了python爬蟲如何爬取網(wǎng)頁數(shù)據(jù)并解析數(shù)據(jù),幫助大家更好的利用爬蟲分析網(wǎng)頁,感興趣的朋友可以了解下2020-09-09numpy如何取出對(duì)角線元素、計(jì)算對(duì)角線元素和np.diagonal
這篇文章主要介紹了numpy如何取出對(duì)角線元素、計(jì)算對(duì)角線元素和np.diagonal問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06Python 幾行代碼即可實(shí)現(xiàn)人臉識(shí)別
Python中實(shí)現(xiàn)人臉識(shí)別功能有多種方法,依賴于python膠水語言的特性,我們通過調(diào)用包可以快速準(zhǔn)確的達(dá)成這一目的,本文給大家分享使用Python實(shí)現(xiàn)簡(jiǎn)單的人臉識(shí)別功能的操作步驟,感興趣的朋友一起看看吧2022-02-02Django配置Mysql數(shù)據(jù)庫連接的實(shí)現(xiàn)
本文主要介紹了Django配置Mysql數(shù)據(jù)庫連接的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03PyCharm中Matplotlib繪圖不能顯示UI效果的問題解決
這篇文章主要介紹了PyCharm中Matplotlib繪圖不能顯示UI效果的問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03python實(shí)現(xiàn)基本進(jìn)制轉(zhuǎn)換的方法
這篇文章主要介紹了python實(shí)現(xiàn)基本進(jìn)制轉(zhuǎn)換的方法,涉及Python數(shù)學(xué)運(yùn)算的取余與字符串操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07Python 實(shí)現(xiàn)一行輸入多個(gè)值的方法
下面小編就為大家分享一篇Python 實(shí)現(xiàn)一行輸入多個(gè)值的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04