1. 程式人生 > >Django中的Ajax詳解

Django中的Ajax詳解

con parse 常見 ref username png cat 狀態 int

AJAX(Asynchronous Javascript And XML)翻譯成中文就是“異步Javascript和XML”。即使用Javascript語言與服務器進行異步交互,傳輸的數據為XML(當然,傳輸的數據不只是XML)。

同步交互:客戶端發出一個請求後,需要等待服務器響應結束後,才能發出第二個請求;
異步交互:客戶端發出一個請求後,無需等待服務器響應結束,就可以發出第二個請求。
AJAX除了異步的特點外,還有一個就是:瀏覽器頁面局部刷新;(這一特點給用戶的感受是在不知不覺中完成請求和響應過程)

一.AJAX常見應用情景

當我們在百度中輸入一個“老字後,會馬上出現一個下拉列表!列表中顯示的是包含字的4個關鍵字。

其實這裏就使用了AJAX技術!當文件框發生了輸入變化時,瀏覽器會使用AJAX技術向服務器發送一個請求,查詢包含字的前10個關鍵字,然後服務器會把查詢到的結果響應給瀏覽器,最後瀏覽器把這4個關鍵字顯示在下拉列表中。

  • 整個過程中頁面沒有刷新,只是刷新頁面中的局部位置而已!
  • 當請求發出後,瀏覽器還可以進行其他操作,無需等待服務器的響應!技術分享圖片

當輸入用戶名後,把光標移動到其他表單項上時,瀏覽器會使用AJAX技術向服務器發出請求,服務器會查詢名為zhangSan的用戶是否存在,最終服務器返回true表示名為lemontree7777777的用戶已經存在了,瀏覽器在得到結果後顯示用戶名已被註冊!

  • 整個過程中頁面沒有刷新,只是局部刷新了;
  • 在請求發出後,瀏覽器不用等待服務器響應結果就可以進行其他操作;

優點:

  • AJAX使用Javascript技術向服務器發送異步請求;
  • AJAX無須刷新整個頁面;
  • 因為服務器響應內容不再是整個頁面,而是頁面中的局部,所以AJAX性能高;

二.$.ajax參數

我們首先來看一個常見的ajax請求的例子,該例子使用ajax來發送點贊請求:

$(document).ready(function () {
    $(".diggit").click(function () {
    //向服務端發送當前的article_id,是否點贊或者踩滅:is_up
    
// 既然要發送文章id,因此我們需要在article_detail.html中新建一個標簽,然後用來存放文章id //首先需要判斷用戶是否已經登入 // <div class="info" article_id="{{ article_detail_obj.article.nid }}" user_name="{{ article_detail_obj.article.user.username }}"></div> //如果自定義屬性user_name有值那就說明用戶已經登入,那我就直接發送Ajax請求 if($(".info").attr("user_name")){ $.ajax({ url:"/users/up_down/", type: "post", data: { is_up:"True", article_id: $(".info").attr("article_id"), csrfmiddlewaretoken: $("input[name=‘csrfmiddlewaretoken‘]").val() }, success:function (data) { // up_down_response = {"status": True, "is_repeat": None} // 判斷status的狀態,為True則點贊成功,那麽將當前的點贊數+1,並且打印點贊成功的消息 console.log(data); // {status: false, is_repeat: true} if(data.status){ current_up_count = parseInt($("#digg_count").text()); current_up_count += 1; $("#digg_count").html(current_up_count); setTimeout(function () { $(".dig_message").html("恭喜您點贊成功").css("color", "red") }, 3000) } else if(data.is_repeat){ setTimeout(function () { $(".dig_message").html("抱歉,不能重復點贊").css("color", "red") }, 3000) } } }) } // 用戶未登入 else { console.log(location.pathname);//拿到的是路徑部分 setTimeout(function () { $(".dig_message").html("抱歉,您還沒有登入,不能進行點贊,3秒後將跳轉到登入頁面").css("color", "red") }, 3000); location.href = "/login/?next=" + location.pathname } }); });

【01】$.ajax的請求參數

######################------------data---------################

       data: 當前ajax請求要攜帶的數據,是一個json的object對象,也就是一個json對象
       ajax方法就會默認地把它編碼成某種格式(urlencoded:?a=1&b=2)發送給服務端;此外,ajax默認以get方式發送請求。
             function testData() {
               $.ajax("/test",{     //此時的data是一個json形式的對象
                  data:{
                    a:1,
                    b:2
                  }
               });                   //?a=1&b=2
######################------------processData---------################

processData:聲明當前的data數據是否進行轉碼或預處理,默認為true,即預處理;如果設置為false,
             那麽對data:{a:1,b:2}會調用json對象的toString()方法,即{a:1,b:2}.toString()
             ,最後得到一個[object,Object]形式的結果。
            
######################------------contentType---------################

contentType:默認值: "application/x-www-form-urlencoded"。發送信息至服務器時內容編碼類型。
即告訴服務器,我客戶端使用的數據編碼格式是urlencoded:urlencoded:?a=1&b=2;
如果想以其他方式提交數據,比如contentType:"application/json",即客戶端告訴服務器,我發送的是一個json字符串:

這裏一定要註意,一旦設定了contentType:"application/json",那麽我們發送給服務器端的數據data必須就是一個json字符串,不能
是json對象,要不然會報錯,這也就是為什麽我們需要使用JSON.stringify來將json對象序列化為一個json字符串的原因了!
               $.ajax("/ajax_get",{
                  data:JSON.stringify({
                       a:22,
                       b:33
                   }),
                   contentType:"application/json",
                   type:"POST",
             
               });                          //{a: 22, b: 33}

    當客戶端設定了我發送給服務端的是json字符串時,那麽服務端拿到數據肯定需要將數據進行反序列化為一個python字符串
    註意此時如果我們設定了客戶端使用的是POST方式發送,那麽我們在服務端取數據的時候就應該從請求體中拿出數據:
    request.body.decode("utf8"),取出的是一個字節字符串,然後使用json.loads進行反序列化成Python中的對象
             views.py:   json.loads(request.body.decode("utf8"))


######################------------traditional---------################

traditional:一般是我們的data數據有數組時會用到 :data:{a:22,b:33,c:["x","y"]},
              traditional為false會對數據進行深層次叠代;  

響應參數:dataType

dataType的功能: 設定HttpHeader中“Accept”域的內容,告訴服務器瀏覽器可以想要返回的數據格式類型,同時JQuery也會根據該類型對返回的數據進行相應的格式轉換,例如客戶端設定dataType的值為:"json",表示我告訴服務端,你返回給我的數據必須是json格式的字符串,

一旦服務端返回給我json字符串後,我可以直接使用,因為jquery會自動將json字符串轉換為JS對象,不需要我們手動去轉換:JSON.parse()

以上就是Django中的AJax知識,筆者將在下一篇博客中為大家詳細介紹Ajax與表單序列化相關的知識。

參考網址:http://blog.csdn.net/walkerjong/article/details/7520485

Django中的Ajax詳解