Django中的Ajax詳解
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詳解