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执行时,它返回一个包装器。包装器是装饰器的核心功能应该执行的地方。。。装饰包装器从上到下执行。