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-Typejson格式的數據給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數據。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM