日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

python案例中Flask全局配置示例詳解_python

作者:老邊 ? 更新時間: 2023-01-03 編程語言

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

欄目分類
最近更新