DRF 解析器与渲染器
DRF 解析器与渲染器
参考 :Django REST framework基础:解析器和渲染器
解析器
解析器的作用
解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己可以处理的数据。本质就是对请求体中的数据进行解析。
在了解解析器之前,我们要先知道Accept以及ContentType请求头。
Accept 请求头用来告知客户端可以处理的内容类型,这种内容类型用MIME类型来表示。借助内容协商机制, 服务器可以从诸多备选项中选择一项进行应用,并使用 Content-Type
应答头通知客户端它的选择。
在响应中,Content-Type标头告诉客户端实际返回的内容的内容类型。
解析器工作原理的就是拿到请求的ContentType来判断前端给我的数据类型是什么,然后我们在后端使用相应的解析器去解析数据。
Django中的数据解析
在视图中我们可以通过request.POST来获取前端发来的请求数据,那么Django框架是如何拿到请求体中的数据的呢?我们一起来看一下:
-
request对象是WSGIRequest 类的实例化对象
-
request.GET, request.POST 数据
tips:
关于property
class Person(object):
def __init__(self, age, weight):
self.__age = age
self.__weight = weight
@property
def age(self):
return self.__age
@age.setter
def age(self, value):
self.__age = value
def _get_weight(self):
return self.__weight
def _set_weight(self, value):
self.__weight = value
weight = property(_get_weight, _set_weight)
if __name__ == '__main__':
p = Person(18, 48)
p.age = 22
p.weight = 66
print(p.age, p.weight)
- 解析数据,Django支持解析的content_type类型有
multipart/form-data
,application/x-www-form-urlencoded
,并没有 JSON类型
DRF中的解析
DRF 默认解析器有三种
全局配置
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': (
...
'rest_framework.parsers.JSONParser',
)
}
此时DRF只能解析JSON格式数据,客户端如果使用浏览器提交,那么你将无法解析。
局部配置
class AuthorListView(ListCreateAPIView):
queryset = models.Author.objects.all()
serializer_class = AuthorModelSerializer
parser_classes = [JSONParser, ]
注意,在视图类中定义的配置项的优先级要高于全局配置中的配置项。
渲染器
渲染器同解析器相反,它定义了框架按照content_type来返回不同的响应。
DRF 提供的渲染器
全局设置
REST_FRAMEWORK = {
...
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
),
}
局部设置
class AuthorListView(ListCreateAPIView):
queryset = models.Author.objects.all()
serializer_class = AuthorModelSerializer
renderer_classes = [JSONRenderer, ]
源码分析
- 请求-->执行APIView 的as_view()方法——》执行APIView 的dispatch() 方法———》执行APIView 的initial()方法——》执行
- 协商选择渲染器并储存信息