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數據。
