DRF - 解析器
https://www.cnblogs.com/sch01ar/p/11271914.html
request.POST 的数据是从 request.body 中提取的,request.POST 有数据需要两个前提条件。
一,请求头中 Content-Type 的值为 application/x-www-form-urlencoded
二,POST 传递的数据格式类似为:username=admin&password=admin123
如果是使用 form 表单提交,也满足上述条件
如果使用 ajax 进行如下的提交,也满足上述条件
$.ajax({
url:...,
type:POST,
// 内部转化为 username=admin&password=admin123
data:{
"username": "admin",
"password": "admin123"
}
})
但是在 ajax 中设置请求头为其它或者数据格式改为 json,则不满足上述条件
$.ajax({
url:...,
type:POST,
// 设置请求头
headers:{"Content-Type": "application/json"}
// 转为 json 数据
data:JSON.stringfy({
"username": "admin",
"password": "admin123"
})
})
这两种情况下 request.body 中有数据,而 request.POST 中无数据
views.py:
from django.shortcuts import HttpResponse
from rest_framework.views import APIView
from rest_framework.parsers import JSONParser, FormParser
class ParserView(APIView):
# 局部解析类
parser_classes = [JSONParser, FormParser, ]
def post(self, request, *args, **kwargs):
# 打印解析后的结果
print(request.data)
return HttpResponse("ParserView Page")
JSONParser:只能解析请求头中含 content-type: application/json 的数据
FormParser:只能解析请求头中含 content-type: application/x-www-form-urlencoded 的数据
parser_classes 中这么设置两个,则遇到哪个请求头处理哪个的数据
提交 json 头的数据

打印的内容:

提交 form 头的数据

打印的结果:

form 应该传的参数为 username=admin&password=admin123
可以在 settings.py 中配置全局解析类
REST_FRAMEWORK = {
"DEFAULT_PARSER_CLASSES": ["rest_framework.parsers.JSONParser", "rest_framework.parsers.FormParser"],
}

浙公网安备 33010602011771号