目前我有这段代码
@app.route("/protect1")
def protect1():
if not session.get('logged_in'):
session['next'] = "/protect1"
return render_template('login.html')
else:
return "This is the first protected page protect1"
@app.route("/protect2")
def protect2():
if not session.get('logged_in'):
session['next'] = "/protect2"
return render_template('login.html')
else:
return "This is the second protected page protect2"
在我的烧瓶应用程序中,一切正常。只有我不需要为每个函数重复(查看)if / else组合。
我希望有一些通用的方式,比如这个pseude-code:
@checklogin
@app.route("/protect1")
def protect1():
return "This is the first protected page protect1"
@checklogin
@app.route("/protect2")
def protect2():
return "This is the second protected page protect2"
这里的一个挑战是@checklogin装饰器需要知道app.route路径(例如“/ protect1”)才能正确设置session ['next']。我不知道如何将此参数传递给装饰器,尤其是如何在第一时间找到它。换句话说,函数protect1()如何知道它是用@ app.route修饰的,以及哪个参数(“/ protect1”)已经传递给那个app.route装饰器?
答案 0 :(得分:2)
装饰者可以在request
上查找路径;使用已加载的网址(this section of the docs提供)或request.url
:
from functools import wraps
from flask import request, session
def checklogin(f):
@wraps(f)
def wrapper(*args, **kwargs):
if not session.get('logged_in'):
session['next'] = request.url
return render_template('login.html')
return f(*args, **kwargs)
return wrapper
在 app.route()
装饰者之后放置装饰者,否则它不会被注册为路线的处理者:
@app.route("/protect1")
@checklogin
def protect1():
return "This is the first protected page protect1"