zoukankan      html  css  js  c++  java
  • flask before_request after_request

    @app.before_request

    如果登陆了,就可以访问 index 和 home 页面,如果没登录就跳转到 login 登录

    要怎么解决呢, session 对, 用 session 除了 Login 函数之外的所有函数里面全校验 session 是否登录了

    太麻烦了,现在咱们只有3个函数,如果成百上千个怎么整啊

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

    怎么办。。。。

    @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)
    
    解决所有问题
    View Code

    @app.before_request 也是一个装饰器,他所装饰的函数,都会在请求进入视图函数之前执行

    request.path 是来读取当前的url地址如果是 /login 就允许直接通过 return None 你可以理解成通过放行

    校验session中是否有user 如果没有的话,证明没有登录,所以毫不留情的 redirect("/login") 跳转登录页面

    还有一个要提的 @app.before_first_request 它与 @app.before_request 极为相似或者说是一模一样,只不过它只会被执行一次

     @app.after_request 

     @app.after_request 在响应(response)返回客户端之前执行 , 结束视图函数之后

    @app.after_request
    def foot_log(environ):
        if request.path != "/login":
            print("有客人访问了",request.path)
        return environ

    1.before_request 请求进入进入视图函数之前进行处理 return None 继续执行 否则阻断
    2.after_request 视图函数结束 响应客户端之前
    正常周期: be1 - be2 - be3 - vf - af3 - af2 - af1
    异常周期: be1 - af3 - af2 - af1 (假设be1 异常)

    .errorhandler

    3.errorhandler 重定义错误信息
    3.1.有参数的装饰器errorhandler(监听错误状态码 5xx 4xx Int)
    3.2.所装饰的函数必须有一个形参来接受 errorMessage

    from flask import Flask, render_template, send_file
    
    app = Flask(__name__)
    
    
    @app.before_request
    def be1():
        print('be1')
        return None
    
    
    @app.before_request
    def be2():
        print('be2')
        return None
        # return "error"
    
    
    @app.before_request
    def be3():
        print('be3')
        return None
        # return "error"
    
    
    @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("/info", methods=["GET", "POST"])
    def info():
        return render_template("info.html")
    
    
    @app.errorhandler(404)
    def error404(error_message):
        print(error_message)
        return send_file('1.png') #404可以不单单返回信息  可以返回图片  音乐等等
    
    if __name__ == '__main__':
        app.run()
  • 相关阅读:
    PAT天梯赛练习 L3-004 肿瘤诊断 (30分) 三维BFS
    PAT天梯赛练习 L3-003 社交集群 (30分) DFS搜索
    HDU6375双端队列
    hdu1801 01翻转 贪心
    hdu1677 贪心
    hdu2126 类01背包(三维数组的二维空间优化)
    HLOJ1361 Walking on the Grid II 矩阵快速幂
    HLOJ1366 Candy Box 动态规划(0-1背包改)
    IDEA,与gradle引入jar包报错
    StarUML激活
  • 原文地址:https://www.cnblogs.com/XLHIT/p/11171897.html
Copyright © 2011-2022 走看看