gpt4 book ai didi

python - decorator() 得到了一个意外的关键字参数

转载 作者:太空宇宙 更新时间:2023-11-03 14:08:29 26 4
gpt4 key购买 nike

我在 Django View 上有这个错误:

TypeError at /web/host/1/
decorator() got an unexpected keyword argument 'host_id'
Request Method: GET
Request URL: http://127.0.0.1:8000/web/host/1/edit
Django Version: 1.10.4
Exception Type: TypeError
Exception Value:
decorator() got an unexpected keyword argument 'host_id'

urlpatterns 是:

 url(r'^host/(?P<host_id>[0-9]+)$', host, name='host'),

View 函数是:

@check_login
def host(request, host_id, *args, **kwargs):
h = Host()
# resultHost = h.get_host(host_id)
return render(request, 'web/host.html')

检查登录如下:

def check_login(f):
"""verify if user login"""
def decorator(request):
if request.session.get('user', None):
return f(request)
else:
return HttpResponseRedirect(reverse("web:login"))
return decorator

如果我使用不带参数“host_id”的 url 和不带 host_id 的主机函数,程序将运行完美。

问题是什么?谢谢。

最佳答案

问题出在 check_login 装饰器代码中。具体问题出在这里:

def check_login(f):
"""verify if user login"""
def decorator(request): # <-- Only allows for a keyword value of 'request'
if request.session.get('user', None):
return f(request)
else:
return HttpResponseRedirect(reverse("web:login"))
return decorator

要解决此问题,您需要接受可能传递给调用的装饰器的任何额外关键字参数。您可以通过使用可变参数来做到这一点,它有效地表示“采用任何额外的关键字参数并将它们表示为单个值”。按照惯例,这个单一值(下例中的 **kwargs)是一个字典,其中键是参数的名称,值是参数值。名称 kwargs 是 Python 中经常用于可变参数的约定,但不是强制性的 - 您可以使用任何有效的变量名称。

def check_login(f):
"""verify if user login"""
def decorator(request, **kwargs): # <-- **kwargs will absorb any additional keyword arguments that are passed during invocation
if request.session.get('user', None):
return f(request, **kwargs)
else:
return HttpResponseRedirect(reverse("web:login"))
return decorator

或者为了让它更通用,您可以像这样接受可变的位置关键字参数:

def check_login(f):
"""verify if user login"""
def decorator(request, *args, **kwargs): # <-- *args will absorb any additional positional arguments
# <-- **kwargs will absorb any additional keyword arguments
if request.session.get('user', None):
return f(request, *args, **kwargs)
else:
return HttpResponseRedirect(reverse("web:login"))
return decorator

有关使用 *args**kwargs 的更多信息,我建议您查看此处的教程:https://pythontips.com/2013/08/04/args-and-kwargs-in-python-explained/

关于python - decorator() 得到了一个意外的关键字参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41372523/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com