前端在使用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)
备注: 一般来讲只要前后端约定好了对用的传输格式,后端其实不需要做兼容的操作了。