Flask第九章(特殊装饰器 @app.before_request 和 @app.after_request 以及@app.errorhandler())

宝剑锋从磨砺出,梅花香自苦寒来。这篇文章主要讲述Flask第九章:特殊装饰器 @app.before_request 和 @app.after_request 以及@app.errorhandler()相关的知识,希望能为你提供帮助。
特殊装饰器 @app.before_request 和 @app.after_request以及@app.errorhandler() 一、背景:Flask我们已经学习很多基础知识了,现在有一个问题
我们现在有一个 Flask 程序其中有3个路由和视图函数,如下:

Flask第九章(特殊装饰器 @app.before_request 和 @app.after_request 以及@app.errorhandler())

文章图片
Flask第九章(特殊装饰器 @app.before_request 和 @app.after_request 以及@app.errorhandler())

文章图片
from flask import Flaskapp = 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个函数,如果成百上千个怎么整啊
装饰器,对没错,装饰器是一个很好的方案,但是啊,我现在还是成败上千个函数,我要在每一个函数定义的时候加上@装饰器,还是很麻烦
其实这两个特殊装饰器就像是Django中的中间件一样。
二、  @app.before_request  :在请求(request)之前做出响应
Flask第九章(特殊装饰器 @app.before_request 和 @app.after_request 以及@app.errorhandler())

文章图片
Flask第九章(特殊装饰器 @app.before_request 和 @app.after_request 以及@app.errorhandler())

文章图片
from flask import Flask from flask import request from flask import redirect from flask import sessionapp = Flask(__name__)# type:Flask app.secret_key = "DragonFire"@app.before_request def is_login(): if request.path == "/login": return Noneif 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") 跳转登录页面
【Flask第九章(特殊装饰器 @app.before_request 和 @app.after_request 以及@app.errorhandler())】还有一个要提的  @app.before_first_request  它与 @app.before_request 极为相似或者说是一模一样,只不过它只会被执行一次
三、@app.after_request  :在响应(response)之前做出响应
@app.after_request def foot_log(environ): if request.path != "/login": print("有客人访问了",request.path) return environ

四、小结:@app.before_request  装饰器的执行是自上而下;@app.after_request 装饰器的执行是自下而上。例如:be1 - be2 - be3 - af3 - af2 - af1;
异常情况下的执行顺序:be1 - af3 - af2 - af1
 
五、@app.errorhandler() :重定义错误页面返回信息比如:当404时则会执行下面的视图函数
@app.errorhandler(404)
def error404(error_info):
return 三剑客+小儿子
 



    推荐阅读