我目前正在运行一个使用以下装饰器的 Python Flask 应用程序:
def login_required(fn):
@wraps(fn)
def wrapper(*args, **kwargs):
if 'phone' in session:
user = User.query.filter_by(phone = session['phone']).first()
if user:
return fn(user, *args, **kwargs)
else:
return redirect(url_for('login'))
return wrapper
Run Code Online (Sandbox Code Playgroud)
我有以下观点:
@app.route('/delete/<eventid>')
@login_required
def delete(eventid):
Run Code Online (Sandbox Code Playgroud)
这是由以下行调用:
url_for('delete', eventid=event.uid)
Run Code Online (Sandbox Code Playgroud)
这会产生以下错误:
delete() got multiple values for keyword argument 'eventid'
Run Code Online (Sandbox Code Playgroud)
delete() 函数在不使用装饰器时起作用。装饰器在不与 delete() 函数一起使用时工作。
我该如何解决这个问题?
您的包装函数将附加参数传递user给装饰函数(在本例中delete)
return fn(user, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
但是您的delete函数只需要一个名为eventid. Python 将第一个 arg (user) 解释为 eventid arg,但随后获得另一个同名的关键字参数,因此出现奇怪的错误消息。
它本质上是这样的:
>>> def delete(eventid):
print eventid
>>> delete('user', eventid='test')
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
delete('user', eventid='test')
TypeError: delete() got multiple values for keyword argument 'eventid'
Run Code Online (Sandbox Code Playgroud)
所以它可以在没有装饰器的情况下工作,因为没有传入用户参数。只需将用户作为第一个参数添加到删除函数中。
| 归档时间: |
|
| 查看次数: |
2684 次 |
| 最近记录: |