Flask - 为关键字参数'eventid'获取多个值 - 装饰器

时间:2014-09-27 20:43:38

标签: python flask

我目前正在运行一个使用以下装饰器的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

我有以下观点:

@app.route('/delete/<eventid>')
@login_required
def delete(eventid):

由以下行调用:

url_for('delete', eventid=event.uid)

这会产生以下错误:

delete() got multiple values for keyword argument 'eventid'

当不使用装饰器时,delete()函数有效。 装饰器在不与delete()函数一起使用时可以工作。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

您的包装函数将另一个参数user传递给修饰函数(在本例中为delete

return fn(user, *args, **kwargs)

但是您的delete函数只需要一个名为eventid的arg。 Python将第一个arg(用户)解释为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'

因此没有装饰器就可以工作,因为没有传入用户arg。只需将用户添加为删除功能的第一个arg。