• ajax介绍


    如果django要返回数据给ajax,则必须要用httpsponse来返回

    ajax的特点:异步和局部刷新

    一、javascript实现ajax

    1、先看如何实现get的方法

    a、先创建一个xmlrequest对象的函数,方便后面创建xmlrequest对象,这个函数的返回值就是xmlrequest对象,通过XMLHttpRequest创建对象

                function createxmlrequest() {
                    var xmlhttp = new XMLHttpRequest();
                    return xmlhttp
                }
    

      

    b、通过调用createxmlrequest函数,接收函数的返回值,获取我们要的对象

    var xmlhttp = createxmlrequest()
    

      

    c、调用open函数,表明我们要和哪个url通信,通过什么方式通信

    xmlhttp.open("GET","/ajax_receive/",true)
    

      

    d、因为我们是用get方式,所有不需要传输数据,但是最好写一个send函数,不然有的浏览器会报错,send函数的参数搞一个null

    xmlhttp.send(null)
    

      

    e、调用onreadystatechange方法监听服务端的返回信息

                xmlhttp.onreadystatechange=function () {
                    alert(xmlhttp.status)
                    alert(xmlhttp.readyState)
                    if (xmlhttp.readyState == 4 && xmlhttp.status == 200){
    {#                    这里的if判断一般都是写死这样的,不用关心#}
                        var data = xmlhttp.responseText;
                        alert(data)
                    }
                }
    

      

    我们看下实际的演示的代码

    先看html的代码

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <input type="button" value="ajax" onclick="test()">
    </body>
        <script>
    
            function test() {
                function createxmlrequest() {
                    var xmlhttp = new XMLHttpRequest();
                    return xmlhttp
                }
                var xmlhttp = createxmlrequest()
                xmlhttp.open("GET","/ajax_receive/",true)
    			
                xmlhttp.send(null)
    }
                xmlhttp.onreadystatechange=function () {
                    alert(xmlhttp.status)
                    alert(xmlhttp.readyState)
                    if (xmlhttp.readyState == 4 && xmlhttp.status == 200){
    {#                    这里的if判断一般都是写死这样的,不用关心#}
                        var data = xmlhttp.responseText;
                        alert(data)
                    }
                }
            }
    
        </script>
    
    </html>
    

      

    在url中的代码,我们上面ajax_receive这个url进行通信

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^index/', views.index),
        url(r'^ajax_receive/', views.ajax_receive),
        url(r'^ajax_register/', views.ajax_register),
    ]
    

      

    然后在看我们的视图函数,我们的视图函数返回一个“haha”

    def ajax_receive(request):
        if request.method.lower() == "post":
            print("--------------->",request.POST)
        return HttpResponse("haha")
    

      

     先访问页面

    点击按钮触发ajax函数

     拿到后台的返回数据

    二、我们在下基于javascript的ajax实现POST方式

    a、还是创建一个函数,这个函数用来创建xmlrequest对象,和get的方式是一样的

                function createxmlrequest() {
                    var xmlhttp = new XMLHttpRequest();
                    return xmlhttp
                }
    

      

    b、创建对象

    var xmlhttp = createxmlrequest();
    

      

    c、创建要通信的url和方式

    xmlhttp.open("post","/ajax_register/",true);
    

      

    d、如果是post方式,这段话必须加上,放在open后面的send的前面

    xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    

      

    e、发送数据

    xmlhttp.send("name=alex");
    

      

    我们可以通过使用+号做字符串拼接。传递一个变量进去

    xmlhttp.send("name="+alex)
    

      

    f、还是做监听

                xmlhttp.onreadystatechange=function () {
                    alert(xmlhttp.status)
                    alert(xmlhttp.readyState)
                    if (xmlhttp.readyState == 4 && xmlhttp.status == 200){
                        这里的if判断一般都是写死这样的,不用关心
                        var data = xmlhttp.responseText;
                        alert(data)
                    }
                }
    

      

    我们在实际测试,先看下前端的html代码

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <input type="button" value="ajax" onclick="test()">
    </body>
        <script>
            function test() {
                function createxmlrequest() {
                    var xmlhttp = new XMLHttpRequest();
                    return xmlhttp
                }
    
                var xmlhttp = createxmlrequest();
                xmlhttp.open("post","/ajax_register/",true);
                xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    {#            这个必须要放在send的前面,且在open后面,设定post的请求头部的格式#}
                xmlhttp.send("name=alex");
    
                xmlhttp.send("name="+alex)
    {#            这个意思是要传递一个变量,用+号连接#}
    
                xmlhttp.onreadystatechange=function () {
                    alert(xmlhttp.status)
                    alert(xmlhttp.readyState)
                    if (xmlhttp.readyState == 4 && xmlhttp.status == 200){
                        这里的if判断一般都是写死这样的,不用关心
                        var data = xmlhttp.responseText;
                        alert(data)
                    }
                }
            }
        </script>
    </html>
    

      

    在看url文件

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^index/', views.index),
        url(r'^ajax_receive/', views.ajax_receive),
        url(r'^ajax_register/', views.ajax_register),
    ]
    

      

    在看视图函数

    def ajax_register(request):
        if request.method == "POST":
            username = request.POST.get("name")
            print("------------>",username)
            if username == "alex":
                return HttpResponse("same")
            else:
                return HttpResponse("no same")
        else:
            return render(request,"regiser.html")
    

      

    我们实际测试,看下后台是否能接受到前台发的数据,可以看到后台可以接受到前台的数据,且可以接受到POST请求

     至此,基于javascript实现的ajax的我们就介绍完了,后面我们重点学习基于jquery的ajax

    二、插播一个js中json对象

     

     js的字符串是双引号的,且必须是双引号,而在python,字符串可以是单引号,也可以双引号的,我们先看下面的一个例子

    如果我们在视图函数中返回一个字典,我们在前端怎么才能接受到呢?

    先看前端的代码

                $.post("/jquery_func/",{name:"zhouyongbo"},function (data) {
                    console.log(data)
                    console.log(typeof data)
                })
    

      

    在看视图函数

    def jquery_func(request):
        temp_dict = {"age":"zhouyongbo"}
        if request.method == "POST":
            print("-----------------POST--------->",request.POST)
        else:
            print("-----------------GET--------->",request.GET)
        return HttpResponse(temp_dict)
    

      

    我们前端测试,看下返回的data和type of data到底是什么,是一个字典的k和字符串,所以我们没有接受视图函数返回的字典

     我们在修改一次视图函数的返回值,我们在视图函数中导入json模块,然后返回值用json.dumps处理

    def jquery_func(request):
        temp_dict = {"age":"zhouyongbo"}
        if request.method == "POST":
            print("-----------------POST--------->",request.POST)
        else:
            print("-----------------GET--------->",request.GET)
        return HttpResponse(json.dumps(temp_dict))  

    看下前端的代码

                $.post("/jquery_func/",{name:"zhouyongbo"},function (data) {
                    console.log(data)
                    console.log(typeof data)
                    console.log(data["name"])
                })
    

      

    前端再次访问测试,前端确实拿到后端传的数据了,但是并我们要想要的字典,也就是js中的object,通过键值对并不能拿到key和values的值

     其实我们还需要在前端代码中也要使用json处理处理下,具体看下代码,这个parse就相当于python中的loads

                $.post("/jquery_func/",{name:"zhouyongbo"},function (data) {
                    console.log(data);
                    console.log(typeof data);
                    data1 = JSON.parse(data);
                    console.log(data1["age"]);
                    console.log(typeof data1);
                })
    

      

    三、介绍下$.ajax方法

    {#            下面学习一下$.ajax#}
    {#            1、$.ajax有两种表现形式,也就是说有两种传参的方式,第一种就是所有的参数放在一个大括号里,第二种方式是url作为一个单独的参数,而其他的#}
    {#            所有的参数在放在一个大括号里#}
    {#            #}
    {#            $.ajax({#}
    {#                #}
    {#            })#}
    {#            #}
    {#            $.ajax("url",{})#}
    
    {#            2、下面介绍$.ajax参数#}
    
    {#            1、data#}
    {##}
    {#            data:{#}
    {#                a:23,#}
    {#                b:34,#}
    {#            }#}
    
    {#            2、url#}
    {##}
    {#            3、type#}
                function test() {
                    $.ajax({
                        url:"/jquery_func/",
                        type:"POST",
                        data:{
                            name:"cuihaoran",
    {#                        age:{school:"hnust",add:"changsha"}#}
                            age:[12,34,56]
                        },
                        traditional:true,
                        dataType:"json",
                        success:function (data) {
                            console.log(data)
                        },
                        error:function (data) {
                            console.log(data)
                        },
                        complate:function (data) {
                            console.log(data)
                        },
                        
    
                    })
                }
    
    {#                traditional:true,#}
    {#                如果传输的数据是这样的#}
    {#                a:["a","c","c"],则后台接受的数据就会有问题,如果有这样的情况就是就需要#}
    {#                把traditional加上,默认写上吧#}
    
    
    
    {##}
    {#                contentType:Text#}
    {#                contentType就是浏览器告诉后端,我传输的数据的类型#}
    
    
    
    {#                processData:false#}
    {#                processData的值为true则会转码,如果为false就是不要转码,可以忘记#}
    {#            })#}
    {#        }#}
    
        </script>
    

      

    ajax中的几个函数在补充一下

      function ajax() {
                $.ajax(
                    {
                        url:"/app1/ajax/",
    
                        type:"POST",
    {#                    data:{#}
    {#                        a:"100",#}
    {#                        b:"200"#}
    {#                    },#}
    
                        data:{
                            a:"1001",
                            b:["aaaa","bbbb"]
                        },
    
                        traditional:true,
                        datatye:"json",
                        success:function (data) {
                            data = JSON.parse(data)
                            console.log(data)
                            console.log(typeof data)
                        },
                        error:function () {
                            console.log(arguments)
                        },
    {#                    complete:function () {#}
    {#                        console.log(arguments)#}
    {#                        console.log("hahha")#}
    {#                    },#}
                        statusCode:{
                            "400":function () {
                                console.log("400")
                            },
                            "500":function () {
                                console.log("500")
                            }
                        }
                    }
                )
            }
        </script>
    

      

    这个的意思,后端必须要要给传我传递json格式的字符串

     这个的意思是如果这次请求和返回都成功,则执行success对应的函数

    这个的意思是如果这次请求和返回有一个失败,则执行error对应的函数

     

    这个的意思是,无论成功失败与否都会执行complete对应的函数

    还可以指定不同的返回码执行不同的函数

     如果返回码是400,则执行400对应的函数,如果返回码是500.则执行500对应的函数

    ------------------------------------------------------------------------------------------------------------------------------------

    如果ajax需要一个json的对象,则后端返回的时候,就需要用json.dumps来处理这个对象

    在前端可以用JSON,parse来处理后端返回的对象

  • 相关阅读:
    匿名内部类
    父类引用指向子类对象【转】
    书签收集
    Linux搭建我的世界服务器
    Python入门学习-DAY27- isinstance与issubclass、反射、内置方法
    Python入门学习-DAY26-绑定方法与非绑定方法
    Python入门学习-DAY25-组合、多态、封装
    Python入门学习-DAY24-继承
    Python入门学习-DAY23-面向对象编程
    Python入门学习-DAY20-常用模块三-re模块、subprocess模块
  • 原文地址:https://www.cnblogs.com/bainianminguo/p/8804513.html
Copyright © 2020-2023  润新知