網站首頁 編程語言 正文
WEB服務全局配置
在目前的開發(fā)過市場當中,有很多WEB服務框架,Flask只是其中之一,但是總體上來看,所有的WEB框架都是依據HTTP協議的邏輯從請求到響應設計的。固然有很多功能是獨立的,但是也有一部分功能需要全局設定,比如安全校驗,比如埋點日志,那么這里就用到了全局配置。
所謂的全局配置,就是在框架全局,請求前后,響應前后,設置的全局配置,比如登錄校驗,這個功能并不是針對單個頁面,而是針對所有頁面的操作,當然可以一個頁面一個頁面的實現,但是更好的辦法就是在請求進入視圖之前,就開始校驗,這樣也可以降低服務器的部分壓力,那么這樣全局設置就是一個很好的方法。
Flask全局配置
flask 同樣也設置了全局的配置,常用的有以下兩種:
before_request
在請求之前執(zhí)行,一般用在對請求內容的過濾的場景下。一般使用的時候需要結合flask本身的request方法。
默認采用裝飾器的方式使用
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),拒絕訪問。
當然也可以不采用裝飾器使用,其實原理上是一樣的:
類似代碼就全部注釋了,嘿嘿嘿
from flask import Flask
from flask import request
app = Flask(__name__)
#....
app.before_request(ip_filter)
#....
if __name__ == '__main__':
app.run()
after_request
在請求處理完成執(zhí)行,這里可以對全局的響應進行配置,比如,全局設置json響應格式,但是需要注意的是after_request的函數必須設置參數接收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": #如果返回數據的類型是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 | 服務器啟動第一次請求之前執(zhí)行,一般初始化一些數據使用 |
teardown_request | 比較難理解,直接和請求上下文環(huán)境掛鉤. 只有在請求上下文被 pop 出請求棧的時候才會觸發(fā),需要先去看看flask請求上下文 |
errorhandler | 發(fā)生錯誤時執(zhí)行,需要提前定義號錯誤句柄,被觸發(fā)的前提是 view_function 中拋出了錯誤 |
template_global | 前后端不分離,jinja2全局變量,比如用戶狀態(tài)可以設置在這里 |
template_filter | 之前聊過的全局jinja2過濾器 |
Flask自定義中間件
flask 支持通過自定義類來替換Flask本身的wsgi_app,當然,簡單的修改建議保留原來的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
相關推薦
- 2022-05-16 docker的具名掛載與匿名掛載實現_docker
- 2023-01-05 Python中glob類的使用方法_python
- 2022-12-28 jquery實現點擊瀏覽器返回上一頁按鈕并能直接刷新_jquery
- 2023-01-03 淺析Go語言中閉包的使用_Golang
- 2023-11-13 【云原生】python獲取docker stats 容器cpu使用率
- 2022-04-18 C++中的命名空間詳細介紹_C 語言
- 2022-02-03 ionic集成極光推送之點擊推送跳轉到指定頁面
- 2022-05-26 簡單聊一聊SQL注入及防止SQL注入_數據庫其它
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支