Django REST 中的解析器用于解析传入 HTTP 请求的内容。在 HTTP 请求中以字符串格式接收数据。解析器将根据 HTTP 请求中收到的 Content-Type 标头将 HTTP 内容解析为 python 数据类型。
Django REST Framework 提供了许多内置的解析器,它们根据接收到的 Content-Type 标头解析不同类型的内容,如 application/json 、multipart/form-data、application/xml 等HTTP 请求。
在使用 restframework 框架的时候我们需要设置返回的数据为 JSON 格式(配置响应数据格式)就需要在 Django 项目的 settings.py 中配置。
![](https://pic3.zhimg.com/80/v2-d6185f025d89d287d313f85bd0ecf816_720w.webp)
Django REST 中的解析器类
JSONParser 解析器
- 传入的请求 JSON 内容解析为 python 内容类型字典。
- Content-Type 设置 application/json 时使用。
FormParser 解析器
- 传入的请求表单内容解析为 QueryDict。
- Content-Type 设置 application/x-www-form-urlencoded 时使用。
MultiPartParser 解析器
- 传入的请求表单内容解析为 QueryDict 。
- Content-Type 设置为 multipart/form-data 时使用。
- request.data 是一个QueryDict 包含所有表单参数的。
- request.files 是一个QueryDict 包含所有表单文件。
- 全面支持 FormParser 和 MultiPartParser 用于对 HTML 表单数据。
![](https://pic2.zhimg.com/80/v2-64664fae5fbdd2553e8f3c4b39afe12d_720w.webp)
Parsers 解析器
settings.py 配置
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.FormParser',
'rest_framework.parsers.MultiPartParser',
]
}
view.py 视图
方式 1
from rest_framework.parsers import JSONParser
from rest_framework.response import Response
from rest_framework.views import APIView
class ExampleView(APIView):
"""
可以接受带有JSON内容的POST请求的视图。
"""
parser_classes = [JSONParser]
def post(self, request, format=None):
return Response({'received data': request.data})
方式 2
from rest_framework.decorators import api_view
from rest_framework.decorators import parser_classes
from rest_framework.parsers import JSONParser
@api_view(['POST'])
@parser_classes([JSONParser])
def example_view(request, format=None):
"""
可以接受带有JSON内容的POST请求的视图
"""
return Response({'received data': request.data})
Parsers 其他示例
FileUploadParser
其中 FileUploadParser 将会遵守 Django 标准的 FILE_UPLOAD_HANDLERS 设置和 request.upload_handlers 属性进行文件上传。
上传文件的视图解析数据,在 URL 指定关键字参数 filename 则会使用该对象上传文件, 否则需要在 headers 指定 Content-Disposition 属性值。
views.py
class FileUploadView(views.APIView):
parser_classes = [FileUploadParser]
def put(self, request, filename, format=None):
file_obj = request.data['file']
# ...
return Response(status=204)
urls.py
urlpatterns = [
...
url(r'^upload/(?P<filename>[^/]+)$', FileUploadView.as_view())
]
YAMLParser
插件安装。
pip install djangorestframework-yaml
settings.py 配置。
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': [
'rest_framework_yaml.parsers.YAMLParser',
],
'DEFAULT_RENDERER_CLASSES': [
'rest_framework_yaml.renderers.YAMLRenderer',
],
}
XMLParser
插件安装。
pip install djangorestframework-xml
settings.py 配置。
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': [
'rest_framework_xml.parsers.XMLParser',
],
'DEFAULT_RENDERER_CLASSES': [
'rest_framework_xml.renderers.XMLRenderer',
],
}
![](https://pic3.zhimg.com/80/v2-7009cc7f9b3a77d42c1f289b9d843c22_720w.webp)