zoukankan      html  css  js  c++  java
  • Flask【第十章】:特殊装饰器 @app.before_request 和 @app.after_request 以及@app.errorhandler

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

    一、背景:

    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个函数,如果成百上千个怎么整啊

    装饰器,对没错,装饰器是一个很好的方案,但是啊,我现在还是成败上千个函数,我要在每一个函数定义的时候加上@装饰器,还是很麻烦

    其实这两个特殊装饰器就像是Django中的中间件一样。

    二、 @app.before_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") 跳转登录页面

    还有一个要提的 @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 三剑客+小儿子

  • 相关阅读:
    数据结构算法
    C++字符串完全指引之二 —— 字符串封装类
    gethostbyname根据主机名获得地址方法
    通过注册表来限定程序的使用时限
    查询图像上的匹配块
    VC++6.0中内存泄漏检测
    qsort 浅析
    shell 中数学计算总结
    最新感悟基础才是王道
    条件表达式中的匹配
  • 原文地址:https://www.cnblogs.com/zhangjunkang/p/10240270.html
Copyright © 2011-2022 走看看