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数据。

猜你喜欢

转载自www.cnblogs.com/glh-ty/p/9665194.html