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

  

posted @ 2021-01-18 16:47  Sch01aR#  阅读(82)  评论(0编辑  收藏  举报