Python 装饰者的顺序在烧瓶视图中重要吗?
我正在使用Python 装饰者的顺序在烧瓶视图中重要吗?,python,flask,python-decorators,flask-login,Python,Flask,Python Decorators,Flask Login,我正在使用login\u requireddecorator和另一个分页输出数据的decorator。哪个先到很重要吗?根据函数装饰器的语法是: @dec2 @dec1 def func(arg1, arg2, ...): pass 这相当于: def func(arg1, arg2, ...): pass func = dec2(dec1(func)) dec1在dec2之前调用 您可以定义这些函数进行如下检查: def dec1(func): print 'dec
login\u required
decorator和另一个分页输出数据的decorator。哪个先到很重要吗?根据函数装饰器的语法是:
@dec2
@dec1
def func(arg1, arg2, ...):
pass
这相当于:
def func(arg1, arg2, ...):
pass
func = dec2(dec1(func))
dec1在dec2之前调用
您可以定义这些函数进行如下检查:
def dec1(func):
print 'dec1'
def dec2(func):
print 'dec2'
@dec2
@dec1
def func():
pass
dec1
dec2
实际上,它不会产生任何错误,但如果您先使用login\u required
并且用户未登录,应用程序将处理数据并在login\u required
函数生成中止后对其进行分页
flask中登录所需的decorator的最佳实现是:
@paginate
@login_required
def view_function():
pass
尽管在这种情况下,无论顺序如何,可能都不会有任何问题,但您可能希望先执行
login\u required
,这样您就不会进行查询并对结果进行分页,而这些查询和分页只会被丢弃
Decorators自下而上地包装原始函数,因此当调用该函数时,每个decorator添加的包装将自上而下地执行@login\u required
应位于假定用户已登录的任何其他装饰程序的下方,以便在其他装饰程序之前评估其条件
@app.route()。否则,将为不代表所有装饰器的函数注册路由
更广泛的答案是,这取决于每个装饰师都在做什么。您需要考虑程序的流程,以及一个先一个是否合乎逻辑。根据所需的登录实现
def login_required(func):
@wraps(func)
def decorated_view(*args, **kwargs):
if current_app.login_manager._login_disabled:
return func(*args, **kwargs)
elif not current_user.is_authenticated():
return current_app.login_manager.unauthorized()
return func(*args, **kwargs)
return decorated_view
你应该像下面这样做
@login_required
@paginate
def view_function():
pass
假设你有另一个decorator是_admin来判断一个用户是否有管理员权限,你应该像下面这样做
@login_required
@is_admin
def view_function():
pass
Flask文档指定,如果函数是一个视图并且有一个路由
装饰器,则顺序很重要。发件人:
当应用进一步的装饰时,请始终记住
route()decorator是最外层的
虽然你的答案中得出结论的所有内容在技术上都是正确的,但你的结论绝对是错误的。你想把@login\u required
放在@paginate
上面--让我解释一下为什么。。。即使从技术上讲,decorator是从下到上执行的,但您必须记住,当decorator执行时,它返回一个包装器。包装器是装饰器的核心功能应该执行的地方。。。装饰包装器从上到下执行。