Decorator() 得到了意外的关键字参数

2023-12-23

我在 Django 视图上遇到此错误:

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'),

视图函数是:

@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

或者为了使其更加通用,您可以接受两个可变参数位置性的 and keyword像这样的论点:

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 and **kwargs我建议查看这里的教程:https://pythontips.com/2013/08/04/args-and-kwargs-in-python-explained/ https://pythontips.com/2013/08/04/args-and-kwargs-in-python-explained/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Decorator() 得到了意外的关键字参数 的相关文章

随机推荐