APIView
前言
APIView解决了一些之前的问题,例如认证授权功能,限流功能,传递参数的形式单一等问题。
一、接收不同类型的参数
修改views.py中的代码。使视图类继承APIView(APIView是View的子类)。
使用View视图我们接收到的request就是WSGIRequest对象或者HTTPRequest对象,但是使用APIView视图我们接收到的request就是Request对象。
# 需继承APIView
#class ProjectViews(View):
class ProjectViews(APIView):
...
- 1.1-1.4其实可以不看,直接看1.5。
1.1 json参数获取
此时想要取json参数就可以使用request.data
来获取,而且不用像View视图那样还得转换,这里我们取到的结果直接就是dict格式。
1.2 x-www-form-urlencoded参数获取
此参数即可通过request.data
获取,又可以兼容之前的request.POST
方式获取。
1.3 form-data参数获取
此参数即可通过request.data
获取,又可以兼容之前的request.POST
方式获取。
1.4 query string参数获取
此参数即可通过request.query_params
获取,又可以兼容之前的request.GET
方式获取。
1.5 总结
不难发现,APIView视图获取参数时,query string参数使用request.query_params
获取,其他参数都使用request.data
获取,并且都兼容之前的获取参数的方式。
二、返回Response
APIView必须返回Response对象,Response拓展了HttpResponse。
class ProjectViews(APIView):
def get(self, request: Request):
...
# return JsonResponse(serializer.data, safe=False, json_dumps_params={"ensure_ascii": False})
# 第一个参数为Python中的常用数据类(字典或者嵌套字典的列表),serializer.data;status参数用于传递响应状态码
# c.Response对象.data属性,可以获取返回给前端的数据
# res = Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.data, status=status.HTTP_200_OK)
- 第一个参数为Python中的常用数据类(字典或者嵌套字典的列表),serializer.data
- status参数用于传递响应状态码
- status.HTTP_200_OK等同于200,使用status的属性是的返回状态码更加易读
- Response对象.data属性,可以获取返回给前端的数据
三、过滤
修改view.py文件实现过滤
class ProjectViews(APIView):
def get(self, request: Request):
qs = Projects.objects.all()
# 获取过滤的参数
name = request.query_params.get('name')
# 判断是否需要过滤
if name:
# 过滤出name为前端传来的name的数据
qs = qs.filter(name__exact=request.query_params.get('name'))
serializer = serializers.ProjectModelSerializer(instance=queryset, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
四、提取
我们的代码中重复用到Projects.objects.all()
的查询集和serializers.ProjectModelSerializer
序列化器类,我们可以把他们抽取出来,便于管理。
class ProjectViews(APIView):
queryset = Projects.objects.all()
serializer_class = serializers.ProjectModelSerializer
def get(self, request: Request):
...
总结
这里的过滤功能感觉不是很好用,我们可以试试GenericAPIView视图。