我们需要用到session验证的时候,可能不止一个视图需要验证,所以装饰器在这个时候就派上了用场,但是!!!!  在flask中的视图已经有一个装饰器@app.route()了,如果我们再写一个装饰器,用于登录认证,查看该访问用户有没有登录,没有登录的话,返回login页面,这样,我们就需要在视图上面写两个装饰器,flask中一定会报错:AssertionError: View function mapping is overwriting an existing endpoint function: nei,下面我们上代码看一下

from flask import Flask, redirect, render_template,request ,session

app = Flask(__name__)
app.secret_key = "liang"


def getsession(func):
    def nei(*args,**kwargs):
        if session.get("user"):
            ret = func(*args,**kwargs)
            return ret
        else:
            return redirect("/login")

    return nei


@app.route("/home")
@getsession
def home():
    return "hello"  # HttpResponse


@app.route("/")
@getsession
def index():
    return render_template("index.html")


@app.route("/login",methods=["POST","GET"])
def login():
    if request.method == "GET":
        return render_template("login.html")

    if request.form.get("username") == "liang" and request.form.get("password") == "abc123":
        session["user"] = request.form.get("username")

        return redirect("/")


app.run(debug=True)

上面是错误的代码,会报错,下面有两种方式可以解决这个问题,瞪大眼睛认真看:

第一种 :  endpoint   反向url地址, 默认视图函数名(url_for)

也就是说给每一个视图加一个这个参数就可以了

第二种 : @functools.wraps(装饰函数)

import  functools 导入

给装饰器的内部函数添加一个装饰就可以了