• 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
    }
  • 相关阅读:
    Js默认参数(多参数情况)
    用clipboard.js实现纯JS复制文本到剪切板
    C# 获取当前方法的名称空间、类名和方法名称
    C# 爬虫 Jumony-html解析
    C# 爬虫 正则、NSoup、HtmlAgilityPack、Jumony四种方式抓取小说
    C# Split 字符文本中的字符太多
    jQuery的ajax跨域 Jsonp原理
    C# 未能加载文件或程序集“xxx”或它的某一个依赖项。参数错误。(异常来自 HRESULT:0x80070057 (E_INVALIDARG))
    美化博客园 添加网易云音乐及生成文章目录
    SQLAlchemy详细教程
  • 原文地址:https://www.cnblogs.com/lxfpy/p/10999685.html
Copyright © 2020-2023  润新知