为什么Flask的url_for在Python中对该项使用装饰器时会抛出错误?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了为什么Flask的url_for在Python中对该项使用装饰器时会抛出错误?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1750字,纯文字阅读大概需要3分钟。
内容图文
![为什么Flask的url_for在Python中对该项使用装饰器时会抛出错误?](/upload/InfoBanner/zyjiaocheng/752/0df8125c4c15405d87acd0971b6b5520.jpg)
我正在创建一个Python Flask应用程序,并在下面创建了装饰器和视图.装饰器在查看索引时效果很好,但是当您注销并使用url_for索引重定向时,它会抛出一个builderror.为什么会
def logged_in(fn):
def decorator():
if 'email' in session:
return fn()
else:
return render_template('not-allowed.html', page="index")
return decorator
@app.route('/')
@logged_in
def index():
email = session['email']
return render_template('index.html', auth=True, page="index", marks=marks)
@app.route('/sign-out')
def sign_out():
session.pop('email')
print(url_for('index'))
return redirect(url_for('index'))
有任何想法吗?错误是:BuildError:(‘index’,{},None)
解决方法:
这里的问题是你返回的decorator()函数的名称与它正在装饰的函数的名称不同,因此URL构建器找不到索引视图.您需要使用functools模块中的wraps()装饰器来复制原始函数的名称.另一个问题(您仍然需要遇到)是您不接受装饰器中的参数并将其传递给原始函数.这是纠正的装饰者:
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中,decorator是一个函数,它将另一个函数作为其参数并返回一个函数作为其结果.所以以下
@logged_in
def index(): pass
基本上是相同的
def index(): pass
index = logged_in(index)
在这种情况下的问题是你的logged_in装饰器返回的不是原始函数,而是包装器(在代码中称为装饰器),它包装了原始函数.这个包装器的名称(装饰器)与它包装的原始函数不同.现在app_route()装饰器,你在logged_in之后调用,看到这个新函数并使用它的名字(装饰器)为它注册一个路由.问题在于:您希望装饰函数具有相同的名称(索引),因此可以在url_for()中使用它来获取它的路径.这就是您需要手动复制名称的原因
decorator.__name__ = fn.__name__
或者更好地使用update_wrapper并从functools模块中包装帮助程序,这样做甚至更多.
内容总结
以上是互联网集市为您收集整理的为什么Flask的url_for在Python中对该项使用装饰器时会抛出错误?全部内容,希望文章能够帮你解决为什么Flask的url_for在Python中对该项使用装饰器时会抛出错误?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。