问题在于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/