在基于Django类的视图中记录URL扭曲时发生TypeError

时间:2019-04-25 13:05:30

标签: python django django-rest-framework django-class-based-views

我在基于django rest框架的API中使用参数化的url。我无法将url参数传递给该url指向的基于类的视图。

我在视图函数定义中使用** kwargs传递url变量,但是在调用url时出错。

网址格式如下-

 url(r'product/(?P<id>\d+)/details/$', APIProductDetails.as_view())

该视图如下所示-

class APIProductDetails(CustomAPI):

    permission_classes = (CustomAuthentication,)

    def get(self, request, **kwargs):
        id = kwargs.get('id',None)
        return Response(data={}, status=200)

    def post(self, request, **kwargs):
        return Response(data={}, status=200)

在使用pytest测试url时,我遇到了以下错误-

TypeError:'id'是此函数的无效关键字参数

我的pytest代码如下-

response = client.get(
        "/api/v1/rm/product/1/details/"
    )

assert response.status_code == 200

其他不包含参数的API可以正常工作。我想念的是什么?

编辑:根据Alasdair评论提供更多详细信息

如注释中所指出,该请求由CustomAPI处理。

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)

错误正在一行中

  

文件“ path / to / app / api_common.py”,第55行,初始       logger.info(“请求:%s,Args:%s,Kwargs:%s”%(请求。 dict ,str(* args),str(** kwargs)))   TypeError:“ id”是此函数的无效关键字参数

str(** kwargs)出问题了吗?

3 个答案:

答案 0 :(得分:1)

当前,您有str(**kwargs)。如果kwargs{'id': '5'},则等效于str(id=5),它会引发TypeError,因为str不接受id

如果要使用kwargs字典的字符串表示形式,请使用:

str(kwargs)

类似地,如果str(*args)len(args) > 1将给出TypeError。您应该使用:

str(args)

答案 1 :(得分:-1)

您应通过方法的self.kwargs而非kwargs访问参数。

Django实际上并没有直接调用您的方法。由于它是在运行时创建类实例的,因此无法像在基于函数的视图中那样访问kwargs。 DRF视图只不过是Django通用视图,因此该规则也适用于它们。

答案 2 :(得分:-1)

或者您可以在方法中传递ID

class APIProductDetails(CustomAPI):

    permission_classes = (CustomAuthentication,)

    def get(self, request, id):
        return Response(data={}, status=200)