DRF解析器使用方法和配置案例

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 中配置。

 

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 表单数据。

 

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',
    ],
}

 

posted @ 2022-11-30 18:16  FFLYY  阅读(50)  评论(0编辑  收藏  举报