记录 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) > 1str(*args) 将给出 TypeError。你应该使用:

str(args)