Django REST framework API 指南(1):请求
Django REST framework API 指南(2):响应
Django REST framework API 指南(3):视图
Django REST framework API 指南(4):通用视图
Django REST framework API 指南(5):视图集
Django REST framework API 指南(6):路由
Django REST framework API 指南(7):解析python
官方原文连接git
REST framework 包含许多内置的解析器类,容许接受各类媒体类型(media types)的请求。还支持自定义解析器,这使你能够灵活地设计 API 接受的媒体类型。github
视图的有效解析器集始终定义为类列表。当访问 request.data
时,REST framework 将检查传入请求的 Content-Type
,并肯定使用哪一个解析器来解析请求内容。ajax
注意:在开发客户端应用程序时,请务必确保在 HTTP 请求中发送数据时设置了
Content-Type
。
若是你不设置 content type,大多数客户端将默认使用'application / x-www-form-urlencoded'
,这可能不是你想要的。 例如,若是你使用 jQuery 和.ajax()
方法发送json
数据,则应确保包含contentType:'application/json'
设置。django
可使用 DEFAULT_PARSER_CLASSES
设置默认的全局解析器。例如,如下设置将只容许带有 JSON
内容的请求,而不是默认的 JSON 或表单数据。json
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': (
'rest_framework.parsers.JSONParser',
)
}
复制代码
还能够在基于类(APIView
)的视图上设置单个视图或视图集的解析器。api
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
装饰器一块儿使用。bash
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})
复制代码
解析 JSON 请求内容。app
.media_type: application/json
ide
解析 HTML 表单内容。request.data
是一个 QueryDict
字典,包含全部表单参数。
一般须要同时使用 FormParser
和 MultiPartParser
,以彻底支持 HTML 表单数据。
.media_type: application/x-www-form-urlencoded
解析文件上传的 multipart HTML 表单内容。 request.data
是一个 QueryDict
(其中包含表单参数和文件)。
一般须要同时使用 FormParser
和 MultiPartParser
,以彻底支持 HTML 表单数据。
.media_type: application/form-data
解析文件上传内容。 request.data
是一个 QueryDict
(只包含一个存有文件的 'file'
key)。
若是与 FileUploadParser
一块儿使用的视图是用 filename
URL 关键字参数调用的,那么该参数将用做文件名。
若是在没有 filename
URL 关键字参数的状况下调用,则客户端必须在 Content-Disposition
HTTP header 中设置文件名。例如 Content-Disposition: attachment; filename=upload.jpg
。
.media_type: */*
请注意:
FileUploadParser
用于本地客户端,能够将文件做为原始数据请求上传。对于基于 Web 的上传,或者对于具备分段上传支持的本地客户端,您应该使用 MultiPartParser
解析器。media_type
与任何 content 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()
的参数是:
表示请求正文的流式对象。
可选。若是提供,则这是传入请求内容的 media type。
根据请求的 Content-Type:
header,能够比渲染器的 media_type
属性更具体,而且可能包含 media type 参数。好比 "text/plain; charset=utf-8"
。
可选。若是提供,则该参数将是一个包含解析请求内容可能须要的任何其余上下文的字典。
默认状况下,这将包括如下 key: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()
复制代码
如下是可用的第三方包。
REST framework YAML 提供 YAML 解析和渲染支持。它之前直接包含在 REST framework 包中,如今做为第三方包。
使用pip安装。
$ pip install djangorestframework-yaml
复制代码
修改 REST framework settings。
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': (
'rest_framework_yaml.parsers.YAMLParser',
),
'DEFAULT_RENDERER_CLASSES': (
'rest_framework_yaml.renderers.YAMLRenderer',
),
}
复制代码
REST Framework XML 提供了一种简单的非正式 XML 格式。它之前直接包含在 REST framework 包中,如今做为第三方包。
使用pip安装。
$ pip install djangorestframework-xml
复制代码
修改 REST framework settings。
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': (
'rest_framework_xml.parsers.XMLParser',
),
'DEFAULT_RENDERER_CLASSES': (
'rest_framework_xml.renderers.XMLRenderer',
),
}
复制代码
配合源码阅读效果更佳哦