栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

这里的问题是,

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

from functools import wrapsdef 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_indef index(): pass

基本上与

def index(): passindex = logged_in(index)

在这种情况下,问题在于

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

decorator.__name__ = fn.__name__

或更好地使用模块中的帮助

update_wrapper
wraps
帮助
functools
,为您做的甚至更多。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/398412.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号