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',
),
}

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

最新文章

  1. word20161216
  2. 夺命雷公狗-----React---26--小案例之react经典案例todos(统计部分的完成)
  3. 怎么解决ZBrush保存历史记录太多问题
  4. Js作用域与作用域链详解
  5. Java学习----对象的状态和行为
  6. 如何将github上的微信客户端类库能够通过composer工具下载
  7. Java在的时候,类定义HashSet初始化方法
  8. asp.net中TextBox里面实现回车触发指定事件
  9. JAVA之锁-cas
  10. putty 默认颜色样式修改 for windows
  11. [JDK8] Optional
  12. HTML字体自动换行第二行缩进一格
  13. bug Spring Mvc中Jsp页面获取不到Controller中的变量
  14. 自制数据结构(容器)-java开发用的最多的ArrayList和HashMap
  15. thinkphp 3.2.3在nginx+php下的url重写配置经验
  16. JQuery和原生JavaScript实现网页定位导航特效
  17. Android实现圆形的图片边角
  18. mysql中根据一个字段相同记录写递增序号,如序号结果,如何实现?
  19. Live Archive 训练题 2019/3/9
  20. vue2.0中,由于页面完成之后dom还未加载完成如何进行操作

热门文章

  1. 5.3.3 deque对象
  2. Linux 数据分析常用 shell命令
  3. ubuntu安装typora
  4. 使用 StackExchange.Redis 封装属于自己的 RedisHelper
  5. C#在WinForm中使用WebKit传递js对象实现与网页交互的方法
  6. bzoj3527
  7. 44. Ext信息提示对话框
  8. 禁用backspace网页回退功能
  9. 能力 or say 职业 规划
  10. Vue项目中如何使用less(添加less依赖)