REST framework框架包含许多内置的Parser类,允许接收各种媒体类型的请求,还支持定义自己的自定义解析器,这是得可以灵活地设计API接收的媒体类型。
如何确定解析器
视图的有效解析器始终定义为类列表。当request.data被访问时,REST framework将检查传入的Content-Type标头,并确定用于解析请求内容的解析器。
注意:在开发客户端应用程序时,请始终记住确保在HTPP请求中发送数据时,设置Content-Type标头。
如果没有设置Content-Type,大多数客户端将默认使用'application/x-www-form-urlencoded'
,这可能不是想要的。
例如,如果使用带有.ajax()方法的jQuery发送json编码数据,应确保包含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):
parser_classes = (JSONParser,)
def post(self, request, format=None):
return Response({"received data": request.data})
使用带有基于函数的视图的@api_view
装饰器:
from rest_framework.decorators import api_view, parser_classes
form rest_framework.parsers import JSONParser
@api_view(["POST"])
@parser_classes((JSONParser,))
def example_view(request, format=None):
return Response({"received data": request.data})
API参考
JSONParser
解析JSON请求内容。
.media_type
:application/json
解析HTML表单内容。request.data将用QueryDict数据填充。
通常希望同时使用FormParser和MutiPartParser,以便完全支持HTML表单数据。
.media_type
:application/x-www-form-urlencoded
FileUploadParser
解析原始文件上传内容。request.data属性是一个包含上传文件的单个键file
的字典。
如果使用FileUploadParser调用了filename URL关键字参数的视图,则该参数将用作文件名。
如果没有filename URL关键字参数被调用,那么客户端必须在HTTP报头Content-Disposition中设置文件名。例如Content-Disposition: attachment; filename=upload.jpg
。
.media_type
:/
注意:
- FileUploadParser适用于可以将文件作为原始数据请求上传的本地客户端。对于基于Web的上传,或者对于具有分段上传支持的本地客户端,应该使用MultiPartParser解析器。
- 由于该解析器的media_type匹配任何内容类型,因此FileUploadParser通常应该是API视图上唯一的解析器集。
FileUploadParser遵循Django标准的FILE_UPLOAD_HANDLERS设置,和reuqest.upload_handlers属性。
示例:
```python
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()),
]
自定义解析器
要实现一个自定义解析器,需要重写BaseParser,设置.media_type
属性,并实现.parse(self, stream, media_type, parser_context)
方法。
该方法应返回将用于填充request.data
属性的数据。
传递给.parse()
的参数是:
stream
表示请求主体的流状对象。
可选项。如果提供,这是传入请求内容的媒体类型。
parser_context
可选项。如果提供,该参数将是包含解析请求内容可能序号的任何附加上下文的字典。
示例
下面是要一个纯文本解析器示例,它将使用表示请求主题的字符串填充request.data属性。
class PlainTextParser(BaseParser):
media_type = "text/plain"
def parse(self, stream, media_type=None, parse_context=None):
return stream.read()