rest_framework学习之解析器(Parsers)

概述

什么是解析器?在DRF中,解析器是一个类列表,当每次接收到请求时,RDF会根据请求头中的Content-type,来指定使用哪钟解析方法去解析数据。当content-type与解析器列表均不匹配时,则会报解析失败。

我们可以在settings.py中全局设置解析器列表,如下:

REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': (
        'rest_framework.parsers.JSONParser',
    )
}

当然,我们也可以在某个视图类中指定解析器,如下:

from rest_framework.views import APIView
from rest_framework.parsers import JSONParser, FormParser

class TestView(APIView):
    parser_classes = (FormParser,)

    def get(self, request):
        print("------------", request.data)
        return Response({"data": "zhubaoxiang"})

    def post(self, request):
        print("------------", request.data)
        return Response({"data": "zhaoerfang"})

需要注意的是,一般get请求中,请求头没有Content-type字段,请求体内也没有值,request.data是空字典,因此解析器也不会生效,解析器更多的是针对POST、PUT请求。

若settings.py与视图中均未设置解析器,DRF默认提供三种解析类,即:JSONParser, FormParser,MultiPartParser,每次请求根据Content-type来匹配使用哪种方式来解析。

解析器类型

DRF默认提供解析器如下:

JSONParser,解析json格式数据({"user": "zhubao"}),解析成功后,request.data类型为dict

FormParser,解析form表单格式数据(user=zhubao),解析成功后,request.data类型为QuerySet

MultiPartParser(用的较少),解析较为复杂的form表单格式数据,解析成功后,request.data类型为QuerySet

FileUploadParser,解析文件上传格式的数据,解析成功后,request.data的值为一个带有key为'file'的dict

当然,DRF也提供自定义解析器,需继承BaseParser,如下(来自DRF官网):

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()

 

 

你可能感兴趣的:(django)