django restframework解析器和分页

解析器

由来

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

时间: 2024-11-09 01:03:24

django restframework解析器和分页的相关文章

rest-framework解析器

解析器 1.json解析器 发一个json格式的post请求.后台打印: request_data---> {'title': '北京折叠'} request.POST---> <QueryDict: {}> 2.urlencode解析器 request_data---> <QueryDict: {'title': ['北京'], 'price': ['122']}> request.POST---> <QueryDict: {'title': ['北

restframework 解析器、url控制组件

一.解析器 1.分类 from rest_framework.parsers import JSONParser, FormParser, FileUploadParser, MultiPartParser a.JSONParser 解析JSON数据类型 b.FormParser 解析urlencode数据类型 c.MultiPartParser 解析form-data数据类型 d.FileUploadParser 解析上传的文件 2.默认的解析器 DEFAULT_PARSER_CLASSES'

Django rest-framework框架

rest-framework框架有哪些作用? 一共有十点. 序列化 queryset对象转化为json给客户端返回. 视图 面试题:你写的类都继承过哪些类? 认证 权限 访问频率限制 路由控制 as_view()加参数,不加参数 解析器 分页 渲染器 查看详情. 版本 查看详情. 根据Django请求声明周期,执行顺序: 路由-->视图-->版本-->认证-->权限-->频率-->解析器-->序列化-->分页-->渲染 出现这种问题: 如何解决? se

DjangoRestFramework学习一之restful规范、APIview、解析器组件、Postman等

DjangoRestFramework学习一之restful规范.APIview.解析器组件.Postman等 本节目录 [TOC] 一 预备知识 预备知识:django的CBV和FBV CBV(class based view):多用,简单回顾一下 FBV(function based view): CBV模式的简单操作:来个登陆页面吧 login.html文件内容如下: <!DOCTYPE html> <html lang="en"> <head>

18.DjangoRestFramework学习一之restful规范、APIview、解析器组件、Postman等

一 预备知识 预备知识:django的CBV和FBV CBV(class based view):多用,简单回顾一下 FBV(function based view): CBV模式的简单操作:来个登陆页面吧 login.html文件内容如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</tit

DRF的解析器和渲染器

解析器 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己想要的数据类型的过程. 本质就是对请求体中的数据进行解析. Django的解析器 我们请求进来请求体中的数据在request.body中,那也就证明,解析器会把解析好的数据放入request.body 我们在视图中可以打印request的类型,能够知道request是WSGIRequest这个类. 我们可以看下这个类的源码,我们是怎么拿到request.POST数据的 application/x-www-form-urlenc

Django框架深入了解_04(DRF之url控制、解析器、响应器、版本控制、分页)

一.url控制 基本路由写法:最常用 from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^books/', views.Books.as_view()), url(r'^book/', views.Book.as_view()), url(r'^login/

rest_framework之解析器、路由控制、分页

解析器 我们都知道,网络传输数据只能传输字符串格式的,如果是列表.字典等数据类型,需要转换之后才能使用 但是我们之前的rest_framework例子都没有转换就直接可以使用了,这是因为rest_framework有一套解析器, 默认他会帮我们转换3种类型的数据,分别是,JSONParser,FormParser,MultiPartParser 而如果我们需要转换其他数据,需要在视图类里配置parser_classes参数,如下: from rest_framework.parsers impo

RestFramework之解析器源码

一,restframework中的解析器 在restframework中,默认可以解析JSONParser, FormParser, MultiPartParser(json数据, urlencode数据, 二进制文件类型数据(图片,视频等))这三种数据格式: RestFramework中,当我们使用CBV写视图函数,继承RestFramework中的APIView时,只要我们在自己写的CBV类中,定义了  parser_classes = [ ]这个属性,那么restframework就会根据