Flask - 为关键字参数“eventid”获得多个值 - 装饰器

jpi*_*tis 1 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
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() 函数一起使用时工作。

我该如何解决这个问题?

Pet*_*son 5

您的包装函数将附加参数传递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)

所以它可以在没有装饰器的情况下工作,因为没有传入用户参数。只需将用户作为第一个参数添加到删除函数中。