我在基于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)出问题了吗?
答案 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)