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()
原文地址:https://www.cnblogs.com/haitaoli/p/10466590.html