Flask中的before_request和after_request


1.@app.before_request 在請求(request)之前做出響應

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

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

實例 

from flask import Flask,render_template,session,jsonify,request,redirect,send_file
app = Flask(__name__)
app.secret_key = "$%^Y&U*I*(&*"

#  在請求進入視圖函數之前 做出響應,只執行一次
@app.before_first_request
def bfe():
    print("111111111")
    # return send_file("settings.py")

#  在請求進入視圖函數之前 做出響應
@app.before_request
def be1():
    print("be1")
    if request.path == "/login":
        return None
    if not session.get("user"):
        return redirect("/login")
    return None

@app.before_request
def be2():
    print("be2")
    return None

@app.before_request
def be3():
    print("be3")
    return None


# 在視圖函數處理之后 響應返回客戶端之前
@app.after_request
def af1(res):
    print("af1")
    return res

@app.after_request
def af2(res):
    print("af2")
    return res

@app.after_request
def af3(res):
    print("af3")
    return res



@app.route("/")
def index():
    print("現在進入視圖函數了")
    return jsonify({"name":1})


@app.route("/login",methods=["GET","POST"])
def login():
    if request.method == "POST":
        session["user"] = request.form.get("username")
        return redirect("/")

    return render_template("login.html")


@app.errorhandler(404)
def error404(arg):
    print(arg)
    return redirect("https://www.autohome.com.cn/beijing/asdfgasdfasdf")

if __name__ == '__main__':
    app.run()

    #直接啟動訪問根路徑的打印結果:
    # 111111111   be1   af3    af2    af1     be1    be2    be3    af3    af2    af1
    # (11111111只被打印一次就沒了)

    # 訪問login:
    # 正常情況:be1 - be2 - be3 - views - af3 - af2 - af1 # 返回順序是定義代碼時的倒敘
    # 異常情況:be1 - af3 - af2 - af1 # 異常阻塞請求的情況

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

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

還有一個要提的 @app.before_first_request 它與 @app.before_request 極為相似或者說是一模一樣,只不過它只會被執行一次

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM