網(wǎng)站首頁 編程語言 正文
WEB服務(wù)全局配置
在目前的開發(fā)過市場當(dāng)中,有很多WEB服務(wù)框架,F(xiàn)lask只是其中之一,但是總體上來看,所有的WEB框架都是依據(jù)HTTP協(xié)議的邏輯從請求到響應(yīng)設(shè)計的。固然有很多功能是獨(dú)立的,但是也有一部分功能需要全局設(shè)定,比如安全校驗,比如埋點(diǎn)日志,那么這里就用到了全局配置。
所謂的全局配置,就是在框架全局,請求前后,響應(yīng)前后,設(shè)置的全局配置,比如登錄校驗,這個功能并不是針對單個頁面,而是針對所有頁面的操作,當(dāng)然可以一個頁面一個頁面的實現(xiàn),但是更好的辦法就是在請求進(jìn)入視圖之前,就開始校驗,這樣也可以降低服務(wù)器的部分壓力,那么這樣全局設(shè)置就是一個很好的方法。
Flask全局配置
flask 同樣也設(shè)置了全局的配置,常用的有以下兩種:
before_request
在請求之前執(zhí)行,一般用在對請求內(nèi)容的過濾的場景下。一般使用的時候需要結(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 #獲取請求用戶ip
if remote_addr in black_list:
return "Not Allowed",405
@app.route("/index")
def index():
return "index"
if __name__ == '__main__':
app.run()
這個時候,如果采用本地ip訪問,就會返回405狀態(tài),拒絕訪問。
當(dāng)然也可以不采用裝飾器使用,其實原理上是一樣的:
類似代碼就全部注釋了,嘿嘿嘿
from flask import Flask
from flask import request
app = Flask(__name__)
#....
app.before_request(ip_filter)
#....
if __name__ == '__main__':
app.run()
after_request
在請求處理完成執(zhí)行,這里可以對全局的響應(yīng)進(jìn)行配置,比如,全局設(shè)置json響應(yīng)格式,但是需要注意的是after_request的函數(shù)必須設(shè)置參數(shù)接收response對象,這個response對象就是視圖返回的的對象。
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": #如果返回數(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ù)器啟動第一次請求之前執(zhí)行,一般初始化一些數(shù)據(jù)使用 |
teardown_request | 比較難理解,直接和請求上下文環(huán)境掛鉤. 只有在請求上下文被 pop 出請求棧的時候才會觸發(fā),需要先去看看flask請求上下文 |
errorhandler | 發(fā)生錯誤時執(zhí)行,需要提前定義號錯誤句柄,被觸發(fā)的前提是 view_function 中拋出了錯誤 |
template_global | 前后端不分離,jinja2全局變量,比如用戶狀態(tài)可以設(shè)置在這里 |
template_filter | 之前聊過的全局jinja2過濾器 |
Flask自定義中間件
flask 支持通過自定義類來替換Flask本身的wsgi_app,當(dāng)然,簡單的修改建議保留原來的wsgi_app對象
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()
原文鏈接:https://juejin.cn/post/7173226140234940430
相關(guān)推薦
- 2022-04-25 Golang將Map的鍵值對調(diào)的實現(xiàn)示例_Golang
- 2022-01-29 寶塔部署Yii框架多個商城項目,隊列問題“服務(wù)測試失敗,請檢查服務(wù)是否正常運(yùn)行”
- 2022-12-11 Go?map發(fā)生內(nèi)存泄漏解決方法_Golang
- 2022-10-07 android?studio后臺服務(wù)使用詳解_Android
- 2023-03-25 Python?Flask-Login模塊使用案例詳解_python
- 2022-06-23 詳解windows?server?2012的DHCP保留地址導(dǎo)出導(dǎo)入、DHCP故障轉(zhuǎn)移配置、DNS條
- 2022-06-08 golang操作rocketmq的示例代碼_Golang
- 2022-10-13 Android自定義View實現(xiàn)QQ消息氣泡_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支