引入
Django REST framework 帮助我们实现了处理 application/JSON 协议请求的数据, 如果不使用 DRF, 直接从 request.body 里面拿到原始的客户端请求的字节数据, 经过 decode , 然后 JSON 反序列化之后, 也可以得到一个 Python 字典类型的数据.
但是, 这种方式并不被推荐, 因为已经有了非常优秀的第三方工具, 那就是 Django REST framework 的解析器组件.
解析器使用
使用方式非常简单, 分为如下两步:
from rest_framework.views import APIView
继承 APIView
直接使用 request.data 就可以获取 JSON 数据
如果你只需要解析 JSON 数据, 不允许任何其他类型的数据请求, 可以这样做:
from rest_framework.parsers import JsonParser
给视图类定义一个 parser_classes 变量, 值为列表类型 [JsonParser]
如果 parser_classes = [] , 那就不处理任何数据类型的请求了.
- from django.shortcuts import render, HttpResponse
- from rest_framework.views import APIView
- from rest_framework.parsers import FormParser
- class CourseView(APIView):
- parser_classes = [FormParser]
- def get(self, request):
- pass
- def post(self, request):
- # request 是被 DRF 封装的新对象, 基于 django 的 request
- # request.data 是一个 property, 用于对数据进行校验
- # request.data 最后会找到 self.parser_classes 中的解析器
- # 来实现对数据进行解析
- data = request.data
- print(data) # {"course_name": "高数", "description": "烧脑..."}
- return HttpResponse(data)
解析器请求流程
1. 路由层加载 as_view() 方法, url 和视图函数之间的绑定关系建立.
与 APIView 执行方式相同
2. 用户发起请求, www.xxx.com/course/ POST 请求方式
- class CourseView(APIView):
- parser_classes = [FormParser]
- def get(self, request):
- pass
- def post(self, request): # 执行
- # request 是被 DRF 封装的新对象, 基于 django 的 request
- # request.data 是一个 property, 用于对数据进行校验
- # request.data 最后会找到 self.parser_classes 中的解析器
- # 来实现对数据进行解析
- data = request.data
- print(data) # {"course_name": "高数", "description": "烧脑..."}
- return HttpResponse(data)
3. request.data 触发解析操作
(1) 在 APIView 中的重写了 request 对象, 在该对象中找 request.data
(2) 在 self.load_data_and_files() 中把解析之后的数据赋值给了 self._full_data
(3) 执行 _parse() 方法, 返回解析之后的数据
实例化 Request 对象时, 传入了 parsers
get_parsers() 返回的是一个列表
调用 parser_classes 属性
api_settings 是个实例化对象, 而且该对象中没有 DEFAULT_PARSER_CLASSES 属性, 所以执行 __getattr__() 方法.
perform_import() 方法
以上是选择解析类的流程
来源: https://www.cnblogs.com/pungchur/p/12015521.html