python - Flask - 获得关键字参数 'eventid' 的多个值 - 装饰器

标签 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() 函数一起使用时起作用。

我该如何解决这个问题?

最佳答案

您的包装函数将附加参数 user 传递给装饰函数(在本例中为 delete)

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

但是您的 delete 函数只接受一个名为 eventid 的参数。 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'

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

关于python - Flask - 获得关键字参数 'eventid' 的多个值 - 装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26079040/

相关文章:

python - 在同一 Python 进程中同时使用 h5py 和 pytables

Python 使用 webbrowser、urllib 和 CookieJar 验证并启动私有(private)页面

python - Flask 引发 TypeError : The view function did not return a valid response

替换了 Python 空匹配

python - 分词器改变词汇条目

python set union 操作在命名元组中表现不佳

Flask-Login用户状态监控

flask - EC2/Kubernetes - 如何通过 EC2 上的 NodePort 访问集群 flask 服务?

python - 使用 Flask 和原生 Python 日志记录?

python - nginx + uwsgi + flask - 禁用自定义错误页面