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',
),
}
注意,在视图类中定义的配置项的优先级要高于全局配置中的配置项。
最新文章
- mysql+mycat搭建稳定高可用集群,负载均衡,主备复制,读写分离
- Execute SQL Task 参数和变量的映射
- 【记录】ASP.NET MVC MapRoute .htm 不起作用
- Github团队开发示例(二)
- 查找数据库中重复的值的数据,having的使用,count(1),sum等聚会函数
- jdbcTemplate的Dao层封装
- QTableWidget控件总结
- iOS 语言切换、本地化,国际化
- PHP数据库基础
- [super init]方法的调用
- Ubuntu Qt arm-linux-androideabi-gcc: Command not found
- 功率单位mW 和 dBm 的换算
- mysql的data数据库只有.frm 而.myd和.myi没有,使用正常
- php的DOMDocument 如何判断xml是否存在某节点
- CI Weekly #20 | 从持续集成的角度看 “云” 的价值
- 每天一个JS 小demo之树菜单。主要知识点:DOM方法综合运用,递归运用
- 对于所有对象都通用方法的解读(Effective Java 第二章)
- Swift3中数组创建方法
- 【编程练习】kmp算法代码
- CSS入门知识汇总