Ajax

AJAX简介

AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML)。

AJAX 不是新的编程语言,而是一种使用现有标准的新方法。

AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。(这一特点给用户的感受是在不知不觉中完成请求和响应过程)

AJAX 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。

同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。

基本操作

做一个页面,点击提交后,页面不刷新
后端代码:

def test_func(request):
    if request.method == 'POST':
        v1 = request.POST.get('v1')
        v2 = request.POST.get('v2')
        sum = int(v1) + int(v2)
        return HttpResponse(sum)
    return render(request, 'test.html')

前端代码:

<body>
    <input type="text" id="d1"> + <input type="text" id="d2"> = <input type="text" id="d3">
    <button id="subBtn">提交</button>

    <script>
        // 1. 给按钮绑定点击事件
        $('#subBtn').click(function () {
            // 2. 先获取等式左侧两个数据
            let v1Val = $('#d1').val();
            let v2Val = $('#d2').val();
            // 3.发送ajax请求
            $.ajax({
                url:'',  // 填写后端地址,三种填写方式,与form标签的action一样
                type:'post', // 请求方式,默认是get
                data:{'v1':v1Val, 'v2':v2Val},  // 发送给后端的数据
                success:function (args) {   // 后端返回结果之后自动触发success,args接收后端返回的数据
                    $('#d3').val(args)
                }
            })
        })
    </script>

做成失去焦点事件:

    <input type="text" id="d1"> + <input type="text" id="d2"> = <input type="text" id="d3">
    <button id="subBtn">提交</button>

    <script>
        // 1. 给按钮绑定点击事件
        $('#d2').blur(function () {
            // 2. 先获取等式左侧两个数据
            let v1Val = $('#d1').val();
            let v2Val = $('#d2').val();
            // 3.发送ajax请求
            $.ajax({
                url:'',  // 填写后端地址,三种填写方式,与form标签的action一样
                type:'post', // 请求方式,默认是get
                data:{'v1':v1Val, 'v2':v2Val},  // 发送给后端的数据
                success:function (args) {   // 后端返回结果之后自动触发success,args接收后端返回的数据
                    $('#d3').val(args)
                }
            })
        })
    </script>

Content-type

Content-type指的是数据编码格式

urlencoded
	ajax默认的数据编码格式/form表单默认数据编码格式
		数据格式:   xxx=yyy&iii=jjj
		django收到上述格式的数据,会自动处理到request.POST中

formdata  在form表单中由enctype定义,使用form-data后,可以发送键值对数据也可以发送文件了
	<form action="" method="post" enctype="multipart/form-data"></form>
		django收到上述格式的数据,会自动处理到request.FILES(文件类型)和request.POST中(普通键值对)

application/json
	form表单不支持,仅限ajax

使用ajax发送json格式数据

后端代码:

def test_func(request):
    if request.method == 'POST':
        print(request.body)  # json格式需要使用request.body接收,为二进制格式
        import json
        res = json.loads(request.body)  # 处理二进制json数据
        print(res)
    return render(request, 'test.html')

前端代码:

<button id="d1">发送json格式数据</button>
<script>
    $('#d1').click(function () {
        $.ajax({
            url:'',
            type:'post',
            data:JSON.stringify({'name': 'Jerry', 'age': 5}),  // 序列化成json格式数据
            contentType:'application/json',    // 指定发送数据编码格式
            success:function (args){
                alert(args)
            }
        })
    })

ajax发送携带文件格式数据

前端代码:

def test_func(request):
    if request.method == 'POST':
        print(request.POST)
        print(request.FILES)
    return render(request, 'test.html')

后端代码:

<input type="file" id="d2">
<button id="d3">携带文件数据</button>
<script>
    $('#d3').click(function () {
        // 1.先产生一个form-data对象,js内置对象
        let myFormDataObj = new FormData();  // 此对象专门用来发送携带文件类型数据
        // 2. 向该对象中添加普通数据(urlencode格式数据)
        myFormDataObj.append('name', 'Jerry');
        myFormDataObj.append('age', 5);
        // 3. 向该对象中添加文件数据
        myFormDataObj.append('file', $('#d2')[0].files[0])  // 获取标签里携带的文件数据
        // 4. 发送ajax请求
        $.ajax({
            url:'',
            type:'post',
            data:myFormDataObj,

            // ajax发送文件固定的两个配置
            contentType:false,   // 因为会用的是myFormDataObj发送的数据,不可以有任何编码,当没有编码时,django会自动识别这个对象
            processData:false,   // 前端不作任何处理,比如打包之类的

            success:function (args) {
                alert(args)

            }
        })
    })
</script>

最终后台日志:

<QueryDict: {'name': ['Jerry'], 'age': ['5']}>    # 在request.POST里
<MultiValueDict: {'file': [<InMemoryUploadedFile: 我的文件.txt (text/plain)>]}>   # 在request.FILES里

其它说明

1. request.is_ajax()   # 判断当前请求是否是ajax请求,返回值:True或False
2. 后端返回的三板斧都会被args接收,不再影响整个浏览器页面
3. 选择使用ajax做前后端交互时,后端一般返回的都是字典数据
      比如可以在字典中字义一个响应状态码,供前端判断使用
      注意:传送到前端后,前端会变为strings格式数据,无法以点的方式获取字典中的数据,解决方法
      方法一:需要在前端使用JSON.parse(args)反序列化json格式数据,代码如下:
    前端:
    def test_func(request):
        if request.method == 'POST':
            user_dict = {'code': 1000, 'username': 'MyJerry'}
            import json
            user_data = json.dumps(user_dict)
            return HttpResponse(user_data)
        return render(request, 'test.html')
    后端:
    <script>
        $('#d1').click(function () {
            $.ajax({
                url:'',
                type:'post',
                data:{'name': 'Jerry'},
                success:function (args) {
                    let userObj = JSON.parse(args)   // 转换数据
                    console.log(userObj.name)    // 转换后就可以用点的形式获取数据
                }
            })
        })
    </script>


    方法二:  在后端使用JsonResponse进行反序列化json格式数据
    后端:
    def test_func(request):
        if request.method == 'POST':
            user_dict = {'code': 1000, 'username': 'MyJerry'}
            from django.http import JsonResponse
            return JsonResponse(user_dict)
        return render(request, 'test.html')
    前端:
    <button id="d1">发送ajax请求</button>
    <script>
        $('#d1').click(function () {
            $.ajax({
                url:'',
                type:'post',
                data:{'name': 'Jerry'},
                success:function (args) {
                    console.log(args.username)
                }
            })
        })
    </script>

    方法三:  使用前端ajax参数:dataType:'json'自动反序列化json格式数据,不需要let userObj = JSON.parse(args)进行转换。后端使用JsonResponse或HttpResponse都可以
    后端代码:
    def test_func(request):
        if request.method == 'POST':
            user_dict = {'code': 1000, 'username': 'MyJerry'}
            import json
            user_obj = json.dumps(user_dict)
            return HttpResponse(user_obj)
        return render(request, 'test.html')

    前端代码:
    <button id="d1">发送ajax请求</button>
    <script>
        $('#d1').click(function () {
            $.ajax({
                url:'',
                type:'post',
                data:{'name': 'Jerry'},
                dataType:'json',
                success:function (args) {
                    console.log(args.username)
                }
            })
        })
    </script>
posted @   树苗叶子  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示