DRF 解析器与渲染器

DRF 解析器与渲染器

参考 :Django REST framework基础:解析器和渲染器

解析器

解析器的作用

解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己可以处理的数据。本质就是对请求体中的数据进行解析。

在了解解析器之前,我们要先知道Accept以及ContentType请求头。

Accept 请求头用来告知客户端可以处理的内容类型,这种内容类型用MIME类型来表示。借助内容协商机制, 服务器可以从诸多备选项中选择一项进行应用,并使用 Content-Type 应答头通知客户端它的选择。

在响应中,Content-Type标头告诉客户端实际返回的内容的内容类型。

解析器工作原理的就是拿到请求的ContentType来判断前端给我的数据类型是什么,然后我们在后端使用相应的解析器去解析数据。

Django中的数据解析

在视图中我们可以通过request.POST来获取前端发来的请求数据,那么Django框架是如何拿到请求体中的数据的呢?我们一起来看一下:

  1. request对象是WSGIRequest 类的实例化对象

  2. request.GET, request.POST 数据

1561988723102

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)

  1. 解析数据,Django支持解析的content_type类型有 multipart/form-data,application/x-www-form-urlencoded,并没有 JSON类型

1561988846885

1561988915934

DRF中的解析

DRF 默认解析器有三种

1561989135102

全局配置

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 提供的渲染器

1561993395376

全局设置

REST_FRAMEWORK = {
    ...
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    ),
}

局部设置

class AuthorListView(ListCreateAPIView):
    queryset = models.Author.objects.all()
    serializer_class = AuthorModelSerializer
    renderer_classes = [JSONRenderer, ]

源码分析

  1. 请求-->执行APIView 的as_view()方法——》执行APIView 的dispatch() 方法———》执行APIView 的initial()方法——》执行

1561993861994

  1. 协商选择渲染器并储存信息

1561993973896

1561994055370

posted @ 2019-08-16 16:38  写bug的日子  阅读(96)  评论(0编辑  收藏  举报