美文网首页
rest_framework 解析器

rest_framework 解析器

作者: eeert2 | 来源:发表于2020-03-03 23:26 被阅读0次

一、什么是解析器。

http请求中,根据请求头的Content-Type
将请求的内容转换为合适的格式就是解析器的工作。

django的解析器太过简单,不能完全满足我们的需要:

    1. django的解析器只能解析表单数据,而前后端分离后,更多的是发送json格式的数据。
      例如向django发送以下json数据,则request.data中有数据,但是则request.POST中没有数据,说明django的解析器没有起作用。
{
    "username": "李师师",
    "password": "sdf097^-sdf112233"
}
    1. django的解析器只能解析POST请求中的数据,对putpatchdelete请求的数据完全没有处理。
      如果我们想要从put请求中获取属性,还需要自己进行格式转换
from django.http import QueryDict

class UserView(View):

    def get(self, request):
        pass
        
    def put(self, request):
        data = QueryDict(request.body)
        ……

        return JsonResponse(data, safe=False)

针对以上原因,rest_framework对解析器做了进一步的加强。
使用rest_framework的解析器后:

    1. 支持对所有请求方法的数据解析,不仅仅是getpost
    1. 获取数据更方便, 通过request.data就能获取解析后的字典数据。
    1. 支持解析的数据格式更多。

二、如何设置rest_framework解析器工作

1. 在单一视图中起作用:

from rest_framework.parsers import JSONParser
from rest_framework.response import Response
from rest_framework.views import APIView

class ExampleView(APIView):
    """
    A view that can accept POST requests with JSON content.
    """

    # 传入多少个解析器,就支持多少中数据输入,最终都是将数据转换成 `dict`
    parser_classes = [JSONParser] 

    def post(self, request, format=None):
        return Response({'received data': request.data})

2. 在全局中配置默认解析器

在每一个视图中都写一次解析器是很麻烦的事情,特别是当我们后续新增某种数据格式的支持,则需要对以前所有的视图都添加这一解析器。

在全局配置是比较常用的方法,如果没有指定解析器,则默认使用全局配置的解析器。一旦在视图中指定解析器,则使用视图指定的解析器。

settings.py中追加以下内容即可完成配置

REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': [
        # 这里添加支持的数据解析
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser',
    ]
}

三、rest_framework自带的解析器

  • JSONParser 解析 json数据, 对应 media_type :application/json

  • FormParser 解析 表单数据, 对应 media_type :application/x-www-form-urlencoded

  • MultiPartParser 解析 表单数据[多项], 对应 media_type :multipart/form-data 。一般同时使用FormParserMultiPartParser,以便完全支持HTML表单数据。

  • FileUploadParser 解析 原始文件上传内容 对应 media_type :*/*,request.data属性将是一个字典,通过request.data['file']获取文件对象。

相关文章

网友评论

      本文标题:rest_framework 解析器

      本文链接:https://www.haomeiwen.com/subject/ucfvkhtx.html