解析器
机交互的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_type:application/json
FormParser
解析HTML表单的内容。 request.data
将与被填充QueryDict
的数据。
您通常会希望同时使用FormParser
,并MultiPartParser
为了共同全力支持HTML表单数据。
.media_type:application/x-www-form-urlencoded
MultiPartParser
解析多HTML表单内容,支持文件上传。双方request.data
将填充用QueryDict
。
您通常会希望同时使用FormParser
,并MultiPartParser
为了共同全力支持HTML表单数据。
.media_type:multipart/form-data
FileUploadParser
解析原始文件上传的内容。该request.data
属性将与单个密钥字典'file'
包含上传的文件。
如果所使用的视图FileUploadParser
是带一个filename
URL关键字参数,则该参数将被用作文件名。
如果它被称为没有一个filename
URL关键字参数,则客户端必须设置文件名Content-Disposition
HTTP标头。例如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
可选的。如果提供,该参数将是包含可能需要解析请求内容的任何附加的上下文中的字典。
默认情况下,这将包括以下键:view
,request
,args
,kwargs
。
例
以下是一个例子明文解析器将填充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。