概述
什么是解析器?在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()