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

FormParser

解析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

表示请求主体的流状对象。

media_type

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

parser_context

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

示例

下面是要一个纯文本解析器示例,它将使用表示请求主题的字符串填充request.data属性。

class PlainTextParser(BaseParser):
    media_type = "text/plain"

    def parse(self, stream, media_type=None, parse_context=None):
        return stream.read()
0条评论

相关推荐

django教程

r

Django 2019-05-20 10:53:53

Celery

celery学习资料

Django 2019-05-25 18:41:55

django教程入门

适合django新人使用的学习手册

Django 2019-07-01 14:28:04

django实用资料

django项目从0到1自己总结的实用的资料,大部分常用的功能这里都有

Django 2019-05-08 18:21:34