zoukankan      html  css  js  c++  java
  • 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的数据是从哪里来的呢?我们通过源码来看一下:

     

     四中解析器对应的数据类型

    我们可以在单个视图或者全局的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',
        )
    }

    注意:当你的项目中只配置了 JSONParser 解析器时,你的项目现在就只能解析JSON格式的数据了,客户端如果使用浏览器提交,那么你将无法解析。

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

    渲染器

    渲染器同解析器相反,它定义了框架按照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页面。

    全局设置

    REST_FRAMEWORK = {
        'DEFAULT_RENDERER_CLASSES': (
            'rest_framework.renderers.JSONRenderer',
        ),
    }
  • 相关阅读:
    19凡路国庆小作业的题解集合(qwq只是我出的题,我会标明出处的)
    一个for打印99乘法表(这是一种实现方式,可以多种方式的)
    采访学长所得
    洛谷P1028 数的计算
    ccf 2019_03_2 二十四点
    ccf 201812-1 小明上学
    洛谷P3387 【模板】缩点
    洛谷P3216 [HNOI2011]数学作业
    洛谷P1471 方差
    HDU 4114 Disney's FastPass
  • 原文地址:https://www.cnblogs.com/huay/p/11895617.html
Copyright © 2011-2022 走看看