解析器的做用就是服务端接收客户端传过来的数据,把数据解析成本身能够处理的数据。本质就是对请求体中的数据进行解析。前端
在了解解析器以前,咱们要先知道Accept以及ContentType请求头。web
Accept是告诉对方我能解析什么样的数据,一般也能够表示我想要什么样的数据。json
ContentType是告诉对方我给你的是什么样的数据类型。后端
解析器工做原理的就是拿到请求的ContentType来判断前端给个人数据类型是什么,而后咱们在后端使用相应的解析器去解析数据。浏览器
在视图中咱们能够经过request.POST来获取前端发来的请求数据,那么Django框架是如何拿到请求体中的数据的呢?咱们一块儿来看一下:app
首先,request对象是 WSGIRequest 类的实例化对象,那咱们去看一下代码:框架
此时咱们回想在Django的视图中经过request.POST和request.FILES可以取到数据都是由于在这里把请求的数据解析,并赋值给request对象了。spa
同时咱们还会发现一个问题就是,Django的解析器是不支持 ContenType为 application/json 的,也就是说没法解析json格式的数据。rest
咱们都知道在DRF中获取请求提交的数据是经过访问request.data,那么request.data的数据是从哪里来的呢?咱们经过源码来看一下:code
若是没有配置解析器,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', ), }
注意,在视图类中定义的配置项的优先级要高于全局配置中的配置项。