Django POST.get()无法获取到前端传过来的json数据

2,003 阅读2分钟

前端在使用post传递json数据的时候有两种格式

1. application/json格式

前端的发送代码为:

axios.post("http://127.0.0.1:8000/api/vue_test/",{
            uname : "张三",
            password: "zhangsan"
        }).then(res => {
            console.log(res.data);
        })

此时我们在后端通过request.POST.get("uname", "")是无法获取到uname, 因此我们要通过request.body来获取相应的数据

Python django 代码如下
class VuetestView(View):
    def post(self, request):
        # request.body返回的是 bytes形式的数据因此需要先转成str形式
        body_unicode = request.body.decode('utf-8')
        # 这里将数据序列化陈dict格式我们就可以任意操作数据了
        body = json.loads(body_unicode)
        data = json.dumps({"uname": body["uname"], "password": body["password"]})
        return HttpResponse(data)

2. application/application/x-www-form-urlencoded格式

前端发送代码为:

var params = new URLSearchParams();
        params.append("uname""张三")
        params.append("password""1234")
        axios.post("http://127.0.0.1:8000/api/vue_test/", params).then(res => {
            console.log(res.data.uname);
            
        })

此时我们可以直接通过request.POST.get("uname", "")的形式获取数据 Python django 代码如下:

class VuetestView(View):
    def post(self, request):        
        uname = request.POST.get("uname", "")        
        password = request.POST.get("password", "")        
        data = json.dumps({"uname": uname, "password": password})        
        return HttpResponse(data)

在前端开发过程中难免会出现两种传输格式混用的情况,因为我们可以在后端判断request的请求头中的的Content_Type参数来判断使用哪种获取数据的方式

Python django 代码如下

class VuetestView(View):    
    def post(self, request):        
        # 这里的CONTENT_TYPE必须全部大写
        content_type = request.META.get("CONTENT_TYPE")        
        if content_type == "application/x-www-form-urlencoded;charset=UTF-8":            
            uname = request.POST.get("uname", "")            
            password = request.POST.get("password", "")            
            data = json.dumps({"uname": uname, "password": password})                    
        else:            
            body_unicode = request.body.decode('utf-8')            
            body = json.loads(body_unicode)            
            data = json.dumps(body)        
        return HttpResponse(data)

备注: 一般来讲只要前后端约定好了对用的传输格式,后端其实不需要做兼容的操作了。