您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

当在Python中对该项目使用装饰器时,为什么Flask的url_for会引发错误?

当在Python中对该项目使用装饰器时,为什么Flask的url_for会引发错误?

这里的问题是,decorator()您返回的函数与正在修饰的函数名称不同,因此URL构建器找不到您的index视图。您需要使用模块中的wraps()装饰器functools来复制原始函数名称。另一个问题(您仍然必须遇到)是您不接受装饰器中的参数并将其传递给原始函数。这是更正的装饰器:

from functools import wraps

def logged_in(fn):
    @wraps(fn)
    def decorator(*args, **kwargs):
        if 'email' in session:
            return fn(*args, **kwargs)
        else:
            # IMO it's nicer to abort here and handle it in errorhandler.
            abort(401)
    return decorator

更多解释 :在Python装饰器中,是一个函数,该函数将另一个函数作为其参数并返回一个函数作为其结果。所以以下

@logged_in
def index(): pass

基本上与

def index(): pass
index = logged_in(index)

在这种情况下,问题在于logged_in装饰器返回的不是原始函数,而是包装原始函数的包装器(decorator代码中称为)。该包装器的名称decorator)与要包装的原始函数不同。现在app.route(),您将在之后调用的decoratorlogged_in看到此新函数,并使用其名称decorator)为其注册路由。问题就出在这里:您希望修饰后的函数具有相同的名称index),因此可用于url_for()为其获取路线。这就是为什么您需要手动复制名称的原因

decorator.__name__ = fn.__name__

或更好地使用模块中的帮助update_wrapperwraps帮助functools,为您做的甚至更多。

Python 2022/1/1 18:29:31 有446人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶