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("")
# 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 极为相似或者说是一模一样,只不过它只会被执行一次