rest framework parsers

解析器

机交互的Web服务更倾向于使用结构化的格式比发送数据格式编码的,因为他们发送比简单的形式更复杂的数据

-马尔科姆Tredinnick,Django开发组

REST框架包含许多内置的解析器类,允许您接受各种媒体类型的请求。也有定义自己的自定义解析器,它给你设计的媒体类型,你的API接受的灵活性支持。

分析器是如何确定的

该组的视图有效的解析器总是被定义为类的列表。当 request.data被访问时,REST框架将检查Content-Type对传入的请求头,并确定要使用到解析请求其内容解析器。


:在开发客户端应用程序永远记住,以确保你设置Content-Type一个HTTP请求发送数据时头。

如果不设置内容类型,大多数客户将默认使用'application/x-www-form-urlencoded',这可能不是你想要的。

举个例子,如果您要发送json使用jQuery与编码数据。阿贾克斯()方法,你应该确保包括contentType: 'application/json'设置。


设置解析器

解析器的默认设置可全局设置,使用DEFAULT_PARSER_CLASSES设置。例如,下面的设置将只允许与要求JSON,而不是JSON或表单数据的默认内容。

REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
    ]
}

您还可以设置用于单个视图或视图集解析器,使用APIView基于类的意见。

from rest_framework.parsers import JSONParser
from rest_framework.response import Response
from rest_framework.views import APIView

class ExampleView(APIView):
    """
    A view that can accept POST requests with JSON content.
    """
    parser_classes = [JSONParser]

    def post(self, request, format=None):
        return Response({'received data': request.data})

或者,如果您使用的是@api_view基于功能观点的装饰。

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):
    """
    A view that can accept POST requests with JSON content.
    """
    return Response({'received data': request.data})

API参考

JSONParser

解析JSON请求内容。

.media_typeapplication/json

FormParser

解析HTML表单的内容。 request.data将与被填充QueryDict的数据。

您通常会希望同时使用FormParser,并MultiPartParser为了共同全力支持HTML表单数据。

.media_typeapplication/x-www-form-urlencoded

MultiPartParser

解析多HTML表单内容,支持文件上传。双方request.data将填充用QueryDict

您通常会希望同时使用FormParser,并MultiPartParser为了共同全力支持HTML表单数据。

.media_typemultipart/form-data

FileUploadParser

解析原始文件上传的内容。该request.data属性将与单个密钥字典'file'包含上传的文件。

如果所使用的视图FileUploadParser是带一个filenameURL关键字参数,则该参数将被用作文件名。

如果它被称为没有一个filenameURL关键字参数,则客户端必须设置文件名Content-DispositionHTTP标头。例如Content-Disposition: attachment; filename=upload.jpg

.media_type*/*

笔记:
  • FileUploadParser是与本地客户端的使用,可以将文件上传的原始数据请求。对于基于网络的上传,或与多上传支持本地客户端,您应该使用MultiPartParser来代替。
  • 由于该解析器的media_type任何内容类型相匹配,FileUploadParser一般应在API视图中仅解析器集。
  • FileUploadParser尊重Django的标准FILE_UPLOAD_HANDLERS设置和request.upload_handlers属性。请参阅Django文档了解更多详情。
基本用法例如:
# views.py
class FileUploadView(views.APIView):
    parser_classes = [FileUploadParser]

    def put(self, request, filename, format=None):
        file_obj = request.data['file']
        # ...
        # do some stuff with uploaded file
        # ...
        return Response(status=204)

# urls.py
urlpatterns = [
    # ...
    url(r'^upload/(?P<filename>[^/]+)$', FileUploadView.as_view())
]

自定义分析器

要实现自定义的解析器,你应该重写BaseParser,设置.media_type属性,并实现.parse(self, stream, media_type, parser_context)方法。

该方法应该返回将被用于填充数据request.data属性。

传递的参数.parse()如下:

代表该请求的主体中的流状物体。

媒体类型

可选的。如果提供的话,这是媒体类型的传入请求的内容。

根据请求的Content-Type:报头,这可能比渲染器的更具体的media_type属性,并且可包括媒体类型参数。例如"text/plain; charset=utf-8"

parser_context

可选的。如果提供,该参数将是包含可能需要解析请求内容的任何附加的上下文中的字典。

默认情况下,这将包括以下键:viewrequestargskwargs

以下是一个例子明文解析器将填充request.data属性与代表请求的主体中的字符串。

class PlainTextParser(BaseParser):
    """
    Plain text parser.
    """
    media_type = 'text/plain'

    def parse(self, stream, media_type=None, parser_context=None):
        """
        Simply return a string representing the body of the request.
        """
        return stream.read()

第三方软件包

下面的第三方软件包也可提供。

Yamla

REST框架YAML提供YAML解析和渲染的支持。这是以前直接计入REST框架封装,现在改为支持作为第三方包。

安装和配置

安装使用PIP。

$ pip install djangorestframework-yaml

修改您的REST架构设置。

REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework_yaml.parsers.YAMLParser',
    ],
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework_yaml.renderers.YAMLRenderer',
    ],
}

XML

REST框架XML提供了一个简单的非正式的XML格式。这是以前直接计入REST框架封装,现在改为支持作为第三方包。

安装和配置

安装使用PIP。

$ pip install djangorestframework-xml

修改您的REST架构设置。

REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework_xml.parsers.XMLParser',
    ],
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework_xml.renderers.XMLRenderer',
    ],
}

MessagePack

MessagePack是一种快速,高效的二进制序列化格式。 胡安里亚萨保持djangorestframework-msgpack包,它提供REST框架MessagePack渲染器和分析器支持。

驼峰JSON

djangorestframework-骆驼情况下提供骆驼情况下JSON渲染器和解析器REST框架。这允许串行器使用Python风格的下划线字段名,但API,如JavaScript式驼峰字段名中暴露出来。这是维护维塔利Babiy

posted @ 2020-03-12 15:13  pythonliuwei  阅读(363)  评论(0编辑  收藏  举报