记录 kwargs 时出现 TypeError
TypeError when logging kwargs
我在记录 kwargs 和 args 时收到 TypeError。下面是我用来记录 kwargs 的 Django View class 的基础 class。
class CustomAPI(APIView):
_url = None
def initial(self, request, *args, **kwargs):
logger.info("Request: %s, Args: %s, Kwargs: %s" % (request.__dict__, str(*args), str(**kwargs)))
CustomAPI._url = request.get_full_path()
super(CustomAPI, self).initial(request, *args, **kwargs)
错误日志显示以下错误-
File "path/to/app/api_common.py", line 55, in initial
logger.info("Request: %s, Args: %s, Kwargs: %s" % (request.dict, str(*args), str(**kwargs)))
TypeError: 'id' is an invalid keyword argument for this function
str(**kwargs) 有问题吗?
您应该通过方法的 self.kwargs
而不是 kwargs
访问参数。
Django 实际上并没有直接调用你的方法。由于它会即时创建 class 实例,因此不会像在基于函数的视图中那样访问 kwargs
。 DRF 视图只不过是 Django 通用视图,所以规则也适用于它们。
或者你可以在方法中传递id
class APIProductDetails(CustomAPI):
permission_classes = (CustomAuthentication,)
def get(self, request, id):
return Response(data={}, status=200)
目前,您有 str(**kwargs)
。如果 kwargs
是 {'id': '5'}
,这等同于 str(id=5)
,这会引发一个 TypeError
因为 str
不接受 id
.
如果你想要 kwargs
字典的字符串表示,那么使用:
str(kwargs)
类似地,如果 len(args) > 1
,str(*args)
将给出 TypeError。你应该使用:
str(args)
我在记录 kwargs 和 args 时收到 TypeError。下面是我用来记录 kwargs 的 Django View class 的基础 class。
class CustomAPI(APIView):
_url = None
def initial(self, request, *args, **kwargs):
logger.info("Request: %s, Args: %s, Kwargs: %s" % (request.__dict__, str(*args), str(**kwargs)))
CustomAPI._url = request.get_full_path()
super(CustomAPI, self).initial(request, *args, **kwargs)
错误日志显示以下错误-
File "path/to/app/api_common.py", line 55, in initial logger.info("Request: %s, Args: %s, Kwargs: %s" % (request.dict, str(*args), str(**kwargs))) TypeError: 'id' is an invalid keyword argument for this function
str(**kwargs) 有问题吗?
您应该通过方法的 self.kwargs
而不是 kwargs
访问参数。
Django 实际上并没有直接调用你的方法。由于它会即时创建 class 实例,因此不会像在基于函数的视图中那样访问 kwargs
。 DRF 视图只不过是 Django 通用视图,所以规则也适用于它们。
或者你可以在方法中传递id
class APIProductDetails(CustomAPI):
permission_classes = (CustomAuthentication,)
def get(self, request, id):
return Response(data={}, status=200)
目前,您有 str(**kwargs)
。如果 kwargs
是 {'id': '5'}
,这等同于 str(id=5)
,这会引发一个 TypeError
因为 str
不接受 id
.
如果你想要 kwargs
字典的字符串表示,那么使用:
str(kwargs)
类似地,如果 len(args) > 1
,str(*args)
将给出 TypeError。你应该使用:
str(args)