zoukankan      html  css  js  c++  java
  • flask(1.1)装饰器装饰多个视图函数出现的问题

    1.装饰器装饰多个视图函数出现的问题

    代码实例:

    from flask import Flask, request, render_template, session, redirect
    
    app = Flask(__name__)
    app.secret_key = "$%@&!**"  # $%@&!**是加密字符串,可随意设置
    
    
    @app.route("/login", methods=["GET", "POST"])
    def login():
        if request.method == "GET":
            return render_template("login.html")
        else:
            session["username"] = request.form.get("username")
            return redirect("/detail")
    
    
    # 自定义装饰器
    def outer(func):
        def inner(*args, **kwargs):
            if session.get("username"):
                ret = func(*args, **kwargs)
                return ret
            else:
                return redirect("/login")
        return inner
    
    
    @app.route("/detail", methods=["GET", ])
    @outer
    def detail():
        return render_template("detail.html")
    
    
    @app.route("/detail2", methods=["GET", ])
    @outer
    def detail2():
        return "this is detail2"
    
    
    if __name__ == '__main__':
        app.run(debug=True)
    
    """
    执行结果:
    AssertionError: View function mapping is overwriting an existing endpoint function: inner
    
    结论: 用装饰器装饰多个视图函数会抛出异常, 原因是多次出现了innner函数,产生覆盖现象
    """
    

    2.使用装饰器修复技术解决该问题

    from flask import Flask, request, render_template, session, redirect
    from functools import wraps
    
    app = Flask(__name__)
    
    app.secret_key = "~!@#$%^"
    
    
    @app.route("/login", methods=["GET", "POST"])
    def login():
        if request.method == "GET":
            return render_template("login.html")
        else:
            session["username"] = request.form.get("username")
            return redirect("/detail")
    
    
    # 自定义装饰器
    def outer(func):
        @wraps(func)  # 装饰器修复技术
        def inner(*args, **kwargs):
            if session.get("username"):
                ret = func(*args, **kwargs)
                return ret
            else:
                return redirect("/login")
    
        return inner
    
    
    @app.route("/detail", methods=["GET", ])
    @outer
    def detail():
        return "this is detail"
    
    
    @app.route("/detail2", methods=["GET", ])
    @outer
    def detail2():
        return "this is detail2"
    
    
    if __name__ == '__main__':
        app.run()
    
  • 相关阅读:
    Ubuntu 开发环境
    机器学习笔记-相似度
    ElasticSearch 笔记-分布式工作原理
    ElasticSearch 笔记-别名
    ElasticSearch 笔记-映射
    ElasticSearch 笔记-基本概念
    Linux 二 常用命令
    经典中的经典算法:动态规划(详细解释,从入门到实践,逐步讲解)
    图解Transformer
    CUDA9.0+tensorflow-gpu1.8.0+Python2.7服务器环境搭建经验
  • 原文地址:https://www.cnblogs.com/haitaoli/p/10466590.html
Copyright © 2011-2022 走看看