django restframework解析器和分页

匿名 (未验证) 提交于 2019-12-02 22:56:40

django请求的原始数据是放到request.body当中,django默认的解析器只负责解析同时满足下面两个条件的数据

  1. 请求头 Content-Type: application/x-www-form-urlencoded
  2. 数据格式要求name=alex&age=18

只要这两个条件有一个不满足,django默认的解析器就不会把数据解析到request.POST里。

情况一: $.ajax({     url: ...     type: POST,  # 请求头默认是 application/x-www-form-urlencoded     data: {name: alex, age = 18}  # 内部转化 name=alex&age=18&gender=男 })  情况二: $.ajax({     url: ...     type: POST,     headers: {'Content-Type': "application/json"}     data: {name: alex, age = 18}  # 内部转化 name=alex&age=18&gender=男 }) # body有值;POST无 情况三: $.ajax({     url: ...     type: POST,     headers: {'Content-Type': "application/json"}     data: JSON.stringfy({name: alex, age = 18})  # {name:alex,age:18...} }) # body有值;POST无 # json.loads(request.body)

restframework提供了更多丰富的解析器能帮我们做数据解析操作

parser是根据请求头 content-type 选择对应的解析器对符合content-type格式的请求体内容进行处理。

from rest_framework.parsers import JSONParser, FormParser,MultiPartParser  class UserView(APIView):     parser_classes = [FormParser, JSONParser, MultiPartParser]      def post(self, request, *args, **kwargs):         print(request.content_type)          # 获取请求的值,并使用对应的JSONParser进行处理         print(request.data)          # application/x-www-form-urlencoded 或 multipart/form-data时,request.POST中才有值         print(request.POST)         print(request.FILES)          return Response('POST请求,响应内容')      def put(self, request, *args, **kwargs):         return Response('PUT请求,响应内容')

全局配置

REST_FRAMEWORK = {     'DEFAULT_PARSER_CLASSES':[         'rest_framework.parsers.JSONParser'         'rest_framework.parsers.FormParser'         'rest_framework.parsers.MultiPartParser'     ]  }

只有在request.data的时候才会调用解析器进行解析




分页,看第n页,每页显示n条数据

from rest_framework.pagination import PageNumberPagination  class MyPageNumberPagination(PageNumberPagination):     page_size = 2     page_query_param = 'page'     # page_size_query_param 相当于临时更改默认的page_size     page_size_query_param = 'size'     max_page_size = 5   class Pager1View(APIView):      def get(self,request,*args,**kwargs):          # 获取所有数据         roles = models.Role.objects.all()          # 创建分页对象         pg = MyPageNumberPagination()          # 在数据库中获取分页的数据,         pager_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)          # 对数据进行序列化         ser = PagerSerialiser(instance=pager_roles, many=True)          return Response(ser.data)

分页,在n个位置,向后查看n条数据

from rest_framework.pagination import LimitOffsetPagination  class MyLimitOffsetPagination(LimitOffsetPagination):     # limit表示页面总共显示多少条数据     default_limit = 2     limit_query_param = 'limit'      # offset表示偏移,从0开始     offset_query_param = 'offset'     max_limit = 5   class Pager1View(APIView):      def get(self,request,*args,**kwargs):          # 获取所有数据         roles = models.Role.objects.all()          # 创建分页对象         # pg = MyLimitOffsetPagination()         pg = LimitOffsetPagination()          # 在数据库中获取分页的数据         pager_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)          # 对数据进行序列化         ser = PagerSerialiser(instance=pager_roles, many=True)          return Response(ser.data)

加密分页,上一页和下一页。请求url:http://127.0.0.1:8000/test/?size=1

from rest_framework.pagination import CursorPagination  class MyCursorPagination(CursorPagination):     cursor_query_param = 'cursor'     page_size = 2     ordering = 'id'     page_size_query_param = "size"     max_page_size = 12  class Pager1View(APIView):      def get(self,request,*args,**kwargs):          # 获取所有数据         roles = Group.objects.all()          # 创建分页对象         # pg = CursorPagination()         pg = MyCursorPagination()          # 在数据库中获取分页的数据         pager_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)          # 对数据进行序列化         ser = GroupSerializer(instance=pager_roles, many=True)          # 这里需要分页对象的get_paginated_response         return pg.get_paginated_response(ser.data)

得到的结果{"next":"http://127.0.0.1:8000/test/?cursor=cD0x&size=1","previous":null,"results":[{"g_name":"linux运维"}]}

原文:https://www.cnblogs.com/longyunfeigu/p/9386451.html

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!