我们需要用到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 导入
给装饰器的内部函数添加一个装饰就可以了