Django REST Framework 学习笔记(四):解析模块 parsers

  • Title(EN): Django REST Framework Learning Notes (4): the parsers module
  • Author: dog2

基本信息

功能

  1. drf给我们提供了多种解析数据包方式的解析类
    • form-data
    • x-www-form-urlencoded
    • json
  2. 我们可以通过配置来控制前台提交的哪些格式的数据后台在解析,哪些数据不解析
  3. 全局配置就是针对每一个视图类,局部配置就是针对指定的视图来,让它们可以按照配置规则选择性解析数据

源码分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# APIView类的dispatch方法中
request = self.initialize_request(request, *args, **kwargs) # 点进去

#准备要解析的数据
parser_context=self.get_parser_context(request) # 不是重点

# 解析模块,获取解析类
parsers=self.get_parsers() # 点进去

# 去类属性(局部配置) 或 配置文件(全局配置) 拿 parser_classes
return [parser() for parser in self.parser_classes]

# self.parser_classes为APIView类属性
parser_classes = api_settings.DEFAULT_PARSER_CLASSES

# api_settings中的解析类
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser', # json数据包
'rest_framework.parsers.FormParser', # x-www-form-urlencoded数据包
'rest_framework.parsers.MultiPartParser', # form-data数据包
],

用法示例

自定义全局配置

所有视图类统一处理,在项目的settings.py

1
2
3
4
5
6
7
8
REST_FRAMEWORK = {
# 全局解析类配置
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser', # json数据包
'rest_framework.parsers.FormParser', # x-www-form-urlencoded数据包
'rest_framework.parsers.MultiPartParser', # form-data数据包
],
}

自定义局部配置

某一个或一些视图类单独处理,在views.py视图类中提供对应的类属性

1
2
3
4
5
from rest_framework.parsers import JSONParser
class Book(APIView):
# 局部解析类配置,只要json类型的数据包才能被解析
parser_classes = [JSONParser]
pass

测试demo

测试代码在这里:no4_drf_parser

其中包含: - django项目 - postman测试数据包:Body标签页定义了3种格式的数据。在局部设置只能某一种或两种,则在postman其他格式传递的数据都不显示。 - json - x-www-form-urlencoded - form-data