第九篇 Flask的before_request和after_request
阿新 • • 發佈:2019-01-11
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