Django REST framework解析器、渲染器、分页

解析器

解析器的作用

解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己可以处理的数据。本质就是对请求体中的数据进行解析。

在了解解析器之前,我们要先知道Accept以及ContentType请求头。

Accept是告诉对方我能解析什么样的数据,通常也可以表示我想要什么样的数据。

ContentType是告诉对方我给你的是什么样的数据类型。

解析器工作原理的就是拿到请求的ContentType来判断前端给我的数据类型是什么,然后我们在后端使用相应的解析器去解析数据。

Django中的数据解析

在视图中我们可以通过request.POST来获取前端发来的请求数据,那么Django框架是如何拿到请求体中的数据的呢?我们一起来看一下:

 首先,request对象是 WSGIRequest 类的实例化对象,那我们去看一下代码:

 

此时我们回想在Django的视图中通过request.POST和request.FILES能够取到数据都是因为在这里把请求的数据解析,并赋值给request对象了。

同时我们还会发现一个问题就是,Django的解析器是不支持 ContenType为 application/json 的,也就是说无法解析json格式的数据。

DRF中的解析器

 我们都知道在DRF中获取请求提交的数据是通过访问request.data,那么request.data的数据是从哪里来的呢?

我们通过源码来看一下:

 

 

 

 

 

如果没有配置解析器,DRF会使用默认的解析器:

 

我们可以在单个视图或者全局的settings.py中配置要使用的解析器。

单个视图配置

class BookViewSet(ModelViewSet):
    queryset = models.Book.objects.all()
    serializer_class = BookModelSerializer
    parser_classes = [JSONParser, ]

全局配置

REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': (
        'rest_framework.parsers.JSONParser',
    )
}

渲染器

渲染器同解析器相反,它定义了框架按照content_type来返回不同的响应。

DRF提供的渲染器有很多,默认是

 'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ),

我们也可以在视图中局部设置也可以在全局的settings.py中进行设置:

局部设置

class PublisherViewSet(ModelViewSet):
    queryset = models.Publisher.objects.all()
    serializer_class = PublisherModelSerializer
    # renderer_classes = [JSONRenderer, ] 这样设置后就只能返回JSON格式的数据了,并不会像之前提供阅读友好的web页面
renderer_classes = [JSONRenderer, BrowsableApiRenderer] 这样就是把JSON嵌套到友好页面里

全局设置

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    ),
}

注意,在视图类中定义的配置项的优先级要高于全局配置中的配置项。

分页器

rest framework中提供了三种分页模式:

from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination

PageNumberPagination

按页码数分页,第n页,每页显示m条数据

例如:http://127.0.0.1:8000/api/article/?page=2&size=1

分页器

class MyPageNumber(PageNumberPagination):
    page_size = 2  # 每页显示多少条
    page_size_query_param = 'size'  # URL中每页显示条数的参数
    page_query_param = 'page'  # URL中页码的参数
    max_page_size = None  # 最大页码数限制

局部配置

我们可以在视图类中进行局部设置

class PublisherViewSet(ModelViewSet):
    queryset = models.Publisher.objects.all()
    serializer_class = PublisherModelSerializer
    pagination_class = MyPageNumber  # 注意不是列表(只能有一个分页模式)

全局配置

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'app01.utils.MyPageNumber',
    'PAGE_SIZE': 100
}

 

posted @ 2019-06-10 19:22  load晴天  阅读(193)  评论(0编辑  收藏  举报