zoukankan      html  css  js  c++  java
  • Django REST framework

    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',
        )
    }
    注意:当你的项目中只配置了 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',
        ),
    }
    

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

  • 相关阅读:
    centos7安装mysql5.7
    centos7 多网卡绑定bond0 之mod4
    二、Windows Server 2016 AD 组织单位、组、用户的创建
    一、Windows Server 2016 AD服务器搭建
    (2)Linux中经常说的CPU上下文切换是什么意思
    (1)Linux系统中到底应该怎么理解系统的平均负载
    centos安装Docker与使用&&构建业务镜像挂载卷harbor仓库的高可用及网络模式和资源限制介绍
    windows和linux各类服务常用端口号汇总
    CentOS7.6搭建LAMP-wordpress论坛搭建
    centos下iptables防火墙规则用法和概述
  • 原文地址:https://www.cnblogs.com/konghui/p/10706370.html
Copyright © 2011-2022 走看看