我正在使用login_required
装饰器和另一个分页输出数据的装饰器。重要的是哪一个先来?
虽然在这种情况下可能没有任何问题,无论顺序如何,您可能希望首先执行login_required
,这样您就不会进行查询和分页结果,这些结果将被丢弃。
装饰器将原始函数从底部包装到顶部,因此在调用函数时,每个装饰器添加的包装器从上到下执行。所以login_required
应该高于任何其他假设用户已登录的装饰器。
更广泛的答案是它取决于每个装饰器正在做什么。你需要考虑你的程序的流程,以及它是否符合逻辑意义。
根据PEP 318,函数装饰器的语法是:
@dec2
@dec1
def func(arg1, arg2, ...):
pass
这相当于:
def func(arg1, arg2, ...):
pass
func = dec2(dec1(func))
并且在dec2之前调用dec1。
您可以定义这些函数以进行如下检查:
def dec1(func):
print 'dec1'
def dec2(func):
print 'dec2'
@dec2
@dec1
def func():
pass
dec1
dec2
实际上它没有任何错误但是如果你首先使用login_reqired
并且用户没有登录应用程序将处理数据并在login_required
函数生成中止之后对其进行分页
烧瓶中login_required装饰器的最佳实现是:
@paginate
@login_required
def view_function():
pass
根据login_required的实现,
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
假设你有另一个装饰者is_admin判断一个用户有管理员权限,你应该像下面这样做
@login_required
@is_admin
def view_function():
pass
Flask文档指定如果函数是视图并且具有route
装饰器,则顺序很重要。来自the docs:
在应用其他装饰器时,请始终记住route()装饰器是最外层的。