1. 程式人生 > >第九篇 Flask的before_request和after_request

第九篇 Flask的before_request和after_request

def pen pat sed return 定義 show 之前 edi

Flask我們已經學習很多基礎知識了,現在有一個問題

我們現在有一個 Flask 程序其中有3個路由和視圖函數,如下:

技術分享圖片
from flask import Flask

app = Flask(__name__)  # type:Flask


@app.route("/login")
def login():
    return "Login"

@app.route("/index")
def index():
    return "Index"

@app.route("/home")
def home():
    return "Login"

app.run(
"0.0.0.0", 5000)
簡單的小程序

如果登陸了,就可以訪問 index 和 home 頁面,如果沒登錄就跳轉到 login 登錄

要怎麽解決呢, session 對, 用 session 除了 Login 函數之外的所有函數裏面全校驗 session 是否登錄了

太麻煩了,現在咱們只有3個函數,如果成百上千個怎麽整啊

裝飾器,對沒錯,裝飾器是一個很好的方案,但是啊,我現在還是成敗上千個函數,我要在每一個函數定義的時候加上@裝飾器,還是很麻煩

那麽就引出了我們@app.before_request

[email protected]_request 在請求(request)進入視圖函數之前做出處理

技術分享圖片
from flask import Flask
from flask import request
from flask import redirect
from flask import session

app = Flask(__name__)  # type:Flask
app.secret_key = "DragonFire"


@app.before_request
def is_login():
    if request.path == "/login":
        return None

    if not session.get("
user"): return redirect("/login") @app.route("/login") def login(): return "Login" @app.route("/index") def index(): return "Index" @app.route("/home") def home(): return "Login" app.run("0.0.0.0", 5000) 解決所有問題
解決所有問題

@app.before_request 也是一個裝飾器,他所裝飾的函數,都會在請求進入視圖函數之前執行

request.path 是來讀取當前的url地址如果是 /login 就允許直接通過 return None 你可以理解成通過放行

校驗session中是否有user 如果沒有的話,證明沒有登錄,所以毫不留情的 redirect("/login") 跳轉登錄頁面

2. @app.after_request 在響應(response)之前做出響應

@app.after_request
def foot_log(environ):
    if request.path != "/login":
        print("有客人訪問了",request.path)
    return environ

3、執行順序問題

@app.before_request
def A():
    pass

def B():
    pass

def C():
    pass

@app.after_request
def a():
    pass

def b():
    pass

def c():
    pass

如上所示執行順序為:A->B->C->視圖函數->c->b->a

如果B函數檢驗沒有通過,則執行順序為:A->B->c->b->a

第九篇 Flask的before_request和after_request