【二十二】Django框架(Rest Framework)之解析器和渲染器

发布时间 2023-07-17 11:17:51作者: Chimengmeng

【一】解析器的作用

  • 解析器的作用就是服务端接收客户端传过来的数据
    • 把数据解析成自己可以处理的数据。
    • 本质就是对请求体中的数据进行解析。
  • 在了解解析器之前
    • 我们要先知道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中配置要使用的解析器。

【1】单个视图配置

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

【2】全局配置

REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': (
        'rest_framework.parsers.JSONParser',
    )
}
  • 注意:
    • 当你的项目中只配置了 JSONParser 解析器时,你的项目现在就只能解析JSON格式的数据了
    • 客户端如果使用浏览器提交,那么你将无法解析。
  • 注意
    • 在视图类中定义的配置项的优先级要高于全局配置中的配置项。

【四】DRF中的渲染器

  • 渲染器同解析器相反
    • 它定义了框架按照content_type来返回不同的响应。
  • DRF提供的渲染器有很多,默认是
'DEFAULT_RENDERER_CLASSES': (
    'rest_framework.renderers.JSONRenderer',
    'rest_framework.renderers.BrowsableAPIRenderer',
),
  • 我们也可以在视图中局部设置也可以在全局的settings.py中进行设置:

【1】局部设置

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

【2】全局设置

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    ),
}
  • 注意
    • 在视图类中定义的配置项的优先级要高于全局配置中的配置项。