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

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值