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"], }