HTTP中的数据类型
BS架构就是基于http协议的,那么在浏览器和服务器进行数据交互式,遵循的http协议的数据格式又是怎样的?
一,form表单提交数据
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="" method="post"> 用户名:<input type="text" name="username"> <br> 密码: <input type="password" name="pwd"> <br> <input type="submit" value="登陆"> </form> </body> </html>
对于这样的form表单提交数据是默认使用的是 enctype="application/x-www-form-urlencoded"的数据格式;当然在发送二进制图片时,我们需要手动修改enctype="multipart/form-data";
其数据在发送时真实格式是:
服务端使用request.POST即可正常拿到数据,是一个 <QueryDict: {'username': ['glh'], 'pwd': ['123']}>;
是应为django的wsgiref解析这种Content-Type的数据格式,为我们把数据封装在了request.POST中,方便我们使用;
那么我们可不可以发送一个Content-Type为json格式的数据给django呢?当然可以!
二 使用ajax发送json数据
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="" method="post" enctype="multipart/form-data"> 用户名:<input type="text" name="username"> <br> 密码: <input type="password" name="pwd"> <br> <input type="submit" value="登陆"> </form> <hr> <button class="btn">ajax提交</button> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script> <script> $(".btn").click(function () { $.ajax({ url: "", type: "post", contentType: 'application/json', data: JSON.stringify({ name: "ggg", // 因为使用的APIview,不用csrf_token age: 18 }), success: function (data) { console.log(data) } }) }) </script> </body> </html>
这样我们就可以利用ajax在前端发送json数据了,
我们看看这次的Content-Type
真实数据是:
我们再看看django的wsgiref模块能不能解析json格式的数据类型,看看我们打印的request.post;
from rest_framework.views import APIView class Login(APIView): def get(self, request): return render(request, "login.html") def post(self, request): print(request.POST) return HttpResponse("post")
结果为空:
也就是说django不能解析json数据的格式,我们去看看wsgiref的源码:
很明显django只解析"application/x-www-form-urlencoded"和"multipart/form-data"这两种数据格式;
那我们只能看request.body中的最初始的数据了:
print(request.post) # 结果为 b'{"name":"ggg","age":18}'
我们也可以自己反序列化拿到数据:
print(request.body) import json print(json.loads(request.body.decode("utf-8"))["name"]) # 可以拿到数据name
但是,django restframework模块下的APIView重新封装的request,是可以解析json数据的,
print(request.data)
# {'name': 'ggg', 'age': 18}
所以以后可以使用django restframework来解析json数据。