一、什么是解析器。
在http请求中,根据请求头的Content-Type,
将请求的内容转换为合适的格式就是解析器的工作。
而django的解析器太过简单,不能完全满足我们的需要:
-
django的解析器只能解析表单数据,而前后端分离后,更多的是发送json格式的数据。
例如向django发送以下json数据,则request.data中有数据,但是则request.POST中没有数据,说明django的解析器没有起作用。
-
{
"username": "李师师",
"password": "sdf097^-sdf112233"
}
-
django的解析器只能解析POST请求中的数据,对put、patch、delete请求的数据完全没有处理。
如果我们想要从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的解析器后:
- 支持对所有请求方法的数据解析,不仅仅是
get、post
- 支持对所有请求方法的数据解析,不仅仅是
- 获取数据更方便, 通过
request.data就能获取解析后的字典数据。
- 获取数据更方便, 通过
- 支持解析的数据格式更多。
二、如何设置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。一般同时使用FormParser和MultiPartParser,以便完全支持HTML表单数据。 -
FileUploadParser解析 原始文件上传内容 对应media_type :*/*,request.data属性将是一个字典,通过request.data['file']获取文件对象。







网友评论