Django 【第十六篇】Ajax基礎
一、Ajax準備知識:json
說起json,我們大家都了解,就是python中的json模塊,那麽json模塊具體是什麽呢?那我們現在詳細的來說明一下
1、json(Javascript Obiect Notation,JS對象標記)是一種輕量級的數據交換格式。
它基於 ECMAScript (w3c制定的js規範)的一個子集,采用完全獨立於編程語言的文本格式來存儲和表示數據。 簡潔和清晰的層次結構使得 JSON 成為理想的數據交換語言。 易於人閱讀和編寫,同時也易於機器解析和生成,並有效地提升網絡傳輸效率。
2、json其實是從js中拿出來的一個對象,也可以說json是js的一個子集。
需要知道的:json的格式來源於js的格式
1、js支持單引號,也支持雙引號,也可以沒有引號
//在js中吧{}這樣的類型叫做對象,js中沒有字典一說
data = { ‘name‘:‘haiyan‘, "name":"haiyan", name:"haiyan" } //js對象默認會把自己的鍵當成字符串處理,所以可以加引號也可以不加
2、json的格式:
1、json只認雙引號的 2、json一定是一個字符串
3、下面我們看看哪些是合格的字符串,那些不是?
合格的json對象:
["one", "two", "three"] {"one": 1, "two": 2, "three": 3 } {"names": ["張三", "李四"] } [ { "name": "張三"}, {"name": "李四"} ]
不合格的json對象:
{ name: "張三", ‘age‘: 32 } // 屬性名必須使用雙引號 [32, 64, 128, 0xFFF] // 不能使用十六進制值 { "name": "張三", "age": undefined } // 不能使用undefined { "name": "張三", "birthday": new Date(‘Fri, 26 Aug 2011 07:13:10 GMT‘), "getName": function() {return this.name;} // 不能使用函數和日期對象 }
+++++++++++++++python中的序列化(dumps)與反序列化(loads)++++++++++++++
import json i = 10 s = "dsfdsf" l = [11,22,33] dic = {"name":"haiyna","age":22} b = True # #吧基本數據類型轉換成字符串的形式 print(json.dumps(i),type(json.dumps(i))) #10 <class ‘str‘> print(json.dumps(s),type(json.dumps(s))) #"dsfdsf" <class ‘str‘> print(json.dumps(l),type(json.dumps(l))) #[11, 22, 33] <class ‘str‘> print(json.dumps(dic),type(json.dumps(dic))) #{"name": "haiyna", "age": 22} <class ‘str‘> print(json.dumps(b),type(json.dumps(b))) #true <class ‘str‘> # ===============json序列化============= d = {"a":1,"b":"fdgfd"} data = json.dumps(d) print(data,type(data)) f = open("a.txt","w") f.write(data) #註意這會寫進去的字符串時雙引號的格式 f.close() # ===============json反序列化============= f = open("a.txt","r") datat = f.read() print(datat,type(datat)) #{"a": 1, "b": "fdgfd"} <class ‘str‘> data = json.loads(datat) print(data,type(data)) #{‘a‘: 1, ‘b‘: ‘fdgfd‘} <class ‘dict‘>
+++++++++++++++JS中的序列化(stringify)與反序列化(parse)++++++++++++++++++
JSON.stringify():用於將一個JavaScript對象轉換為JSON字符串
JSON.parse():用於將一個JSON字符串轉換為JavaScript對象
<script> //===========js中的json序列化=========== s = ‘{"name":1}‘; var data = JSON.parse(s); console.log(data); console.log(typeof data); //object //===========js中的json的反序列化======= s2={‘name‘:‘yuan‘}; console.log(JSON.stringify(s2),typeof JSON.stringify(s2)) //string </script>
二、JSON和XML的比較
1、XML也是存數據的一種格式,也是一種標記語言。它是利用節點進行查找的
2、JSON 格式於2001年由 Douglas Crockford 提出,目的就是取代繁瑣笨重的 XML 格式。
JSON 格式有兩個顯著的優點:書寫簡單,一目了然;符合 JavaScript 原生語法,可以由解釋引擎直接處理,不用另外添加解析代碼。所以,JSON迅速被接受,已經成為各大網站交換數據的標準格式,並被寫入ECMAScript 5,成為標準的一部分。
XML和JSON都使用結構化方法來標記數據,下面來做一個簡單的比較。
用XML表示中國部分省市數據如下:
<?xml version="1.0" encoding="utf-8"?> <country> <name>中國</name> <province> <name>黑龍江</name> <cities> <city>哈爾濱</city> <city>大慶</city> </cities> </province> <province> <name>廣東</name> <cities> <city>廣州</city> <city>深圳</city> <city>珠海</city> </cities> </province> <province> <name>臺灣</name> <cities> <city>臺北</city> <city>高雄</city> </cities> </province> <province> <name>新疆</name> <cities> <city>烏魯木齊</city> </cities> </province> </country>
用JSON表示如下:
{ "name": "中國", "province": [{ "name": "黑龍江", "cities": { "city": ["哈爾濱", "大慶"] } }, { "name": "廣東", "cities": { "city": ["廣州", "深圳", "珠海"] } }, { "name": "臺灣", "cities": { "city": ["臺北", "高雄"] } }, { "name": "新疆", "cities": { "city": ["烏魯木齊"] } }] }
可以看到,JSON 簡單的語法格式和清晰的層次結構明顯要比 XML 容易閱讀,並且在數據交換方面,由於 JSON 所使用的字符要比 XML 少得多,可以大大得節約傳輸數據所占用得帶寬。
註意:
JSON格式取代了xml給網絡傳輸帶來了很大的便利,但是卻沒有了xml的一目了然,尤其是json數據很長的時候,我們會陷入繁瑣復雜的數據節點查找中。 但是國人的一款在線工具 BeJson 、SoJson在線工具讓眾多程序員、新接觸JSON格式的程序員更快的了解JSON的結構,更快的精確定位JSON格式錯誤。
三、Ajax簡介
1、簡單介紹
我們以前知道的前端向後端發送數據的方式有:
GET:地址欄、a標簽、Form表單
POST:Form表單
那麽現在我們在學習一種:那就是ajax
ajax:也是前端向後端發送數據的一種方式
AJAX(Asynchronous Javascript And XML)翻譯成中文就是“異步Javascript和XML”。即使用Javascript語言與服務器進行異步交互,傳輸的數據為XML(當然,傳輸的數據不只是XML)。
- 同步交互:客戶端發出一個請求後,需要等待服務器響應結束後,才能發出第二個請求;
- 異步交互:客戶端發出一個請求後,無需等待服務器響應結束,就可以發出第二個請求。
Ajax的特點:
異步交互: 當請求發出後,瀏覽器還可以進行其他操作,無需等待服務器的響應!
局部刷新: 整個過程中頁面沒有刷新,只是刷新頁面中的局部位置而已!
js的局部刷新:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .error{ color:red } </style> </head> <body> <form class="Form"> <p>姓名 <input class="v1" type="text" name="username" mark="用戶名"></p> <p>密碼 <input class="v1" type="text" name="email" mark="郵箱"></p> <p><input type="submit" value="submit"></p> </form> <script src="jquery-3.1.1.js"></script> <script> $(".Form :submit").click(function(){ flag=true; $("Form .v1").each(function(){ var value=$(this).val(); if (value.trim().length==0){ var mark=$(this).attr("mark"); var $span=$("<span>"); $span.html(mark+"不能為空!"); $span.prop("class","error"); $(this).after($span); setTimeout(function(){ $span.remove(); },800); flag=false; return flag; } }); return flag }); </script> </body> </html>
2、ajax的創建應用場景
當我們在百度中輸入一個“老”字後,會馬上出現一個下拉列表!列表中顯示的是包含“老”字的4個關鍵字。
其實這裏就使用了AJAX技術!當文件框發生了輸入變化時,瀏覽器會使用AJAX技術向服務器發送一個請求,查詢包含“老”字的前10個關鍵字,然後服務器會把查詢到的結果響應給瀏覽器,最後瀏覽器把這4個關鍵字顯示在下拉列表中。
- 整個過程中頁面沒有刷新,只是刷新頁面中的局部位置而已!
- 當請求發出後,瀏覽器還可以進行其他操作,無需等待服務器的響應!
當輸入用戶名後,把光標移動到其他表單項上時,瀏覽器會使用AJAX技術向服務器發出請求,服務器會查詢名為zhangSan的用戶是否存在,最終服務器返回true表示名為lemontree7777777的用戶已經存在了,瀏覽器在得到結果後顯示“用戶名已被註冊!”。
- 整個過程中頁面沒有刷新,只是局部刷新了;
- 在請求發出後,瀏覽器不用等待服務器響應結果就可以進行其他操作;
3、ajax的優點,,特點也就是優點。。
優點:
- AJAX使用Javascript技術向服務器發送異步請求;
- AJAX無須刷新整個頁面;
- 因為服務器響應內容不再是整個頁面,而是頁面中的局部,所以AJAX性能高;
四、jQuery實現的ajax
tishi.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Title</title> </head> <body> <a href="/get_OK/">點擊</a><span class="error"></span> <hr> <p>姓名<input type="text"></p> <p>密碼<input type="password"></p> <p><button class="Ajax_send">Ajax_send</button><span class="login_error"></span></p> <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.js "></script> <script> $(".Ajax_send").click(function () { // ajax請求 $.ajax({ url:"/tishi_ajax/", //請求路徑 type:"GET", //請求方式 //吧js對象轉成json字符串 data:JSON.stringify({ name:$(":text").val(), pwd:$(":password").val() }), // 請求數據 ,是js數據 ?name=yuan&pwd=123 contentType:"application/json", //告訴服務器發的是json的格式 success:function (data) { var data=JSON.parse(data); //js中的反序列化 console.log(data); console.log(typeof data); // $(".error").html(data) if(!data["flag"]){ //為False的情況 $(".login_error").html("用戶名或者密碼錯誤") } } }) }) </script> </body> </html>
view
def tishi_ajax(request): username=request.GET.get("name") password=request.GET.get("pwd") response={"flag":False} if username=="yuan" and password=="123": response["flag"]=True import json import time return HttpResponse(json.dumps(response)) def tishi(request): return render(request,"tishi.html")
{% load staticfiles %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="{% static ‘JS/jquery-3.1.1.js‘ %}"></script> </head> <body> <button class="send_Ajax">send_Ajax</button> <script> //$.ajax的兩種使用方式: //$.ajax(settings); //$.ajax(url,[settings]); $(".send_Ajax").click(function(){ $.ajax({ url:"/handle_Ajax/", type:"POST", data:{username:"Yuan",password:123}, //==================成功的時候要執行的代碼================== success:function(data){ alert(data) }, //=================== error的時候要執行的代碼============ error: function (jqXHR, textStatus, err) { // jqXHR: jQuery增強的xhr // textStatus: 請求完成狀態 // err: 底層通過throw拋出的異常對象,值與錯誤類型有關 console.log(arguments); }, //=================== complete(無論成功還是失敗,都要執行的代碼)============ complete: function (jqXHR, textStatus) { // jqXHR: jQuery增強的xhr // textStatus: 請求完成狀態 success | error console.log(‘statusCode: %d, statusText: %s‘, jqXHR.status, jqXHR.statusText); console.log(‘textStatus: %s‘, textStatus); }, //=================== statusCode============ statusCode: { ‘403‘: function (jqXHR, textStatus, err) { console.log(arguments); //註意:後端模擬errror方式:HttpResponse.status_code=500 }, ‘400‘: function () { } } }) }) </script> </body> </html>
五、ajax參數
請求參數
######################------------data---------################ data: 當前ajax請求要攜帶的數據,是一個json的object對象,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,即預處理;if為false, 那麽對data:{a:1,b:2}會調用json對象的toString()方法,即{a:1,b:2}.toString() ,最後得到一個[object,Object]形式的結果。 ######################------------contentType---------################ contentType:默認值: "application/x-www-form-urlencoded"。發送信息至服務器時內容編碼類型。 用來指明當前請求的數據編碼格式;urlencoded:?a=1&b=2;如果想以其他方式提交數據, 比如contentType:"application/json",即向服務器發送一個json字符串: $.ajax("/ajax_get",{ data:JSON.stringify({ a:22, b:33 }), contentType:"application/json", type:"POST", }); //{a: 22, b: 33} 註意:contentType:"application/json"一旦設定,data必須是json字符串,不能是json對象 ######################------------traditional---------################ traditional:一般是我們的data數據有數組時會用到 :data:{a:22,b:33,c:["x","y"]}, traditional為false會對數據進行深層次叠代;
響應參數
/* dataType: 預期服務器返回的數據類型,服務器端返回的數據會根據這個值解析後,傳遞給回調函數。 默認不需要顯性指定這個屬性,ajax會根據服務器返回的content Type來進行轉換; 比如我們的服務器響應的content Type為json格式,這時ajax方法就會對響應的內容 進行一個json格式的轉換,if轉換成功,我們在success的回調函數裏就會得到一個json格式 的對象;轉換失敗就會觸發error這個回調函數。如果我們明確地指定目標類型,就可以使用 data Type。 dataType的可用值:html|xml|json|text|script 見下dataType實例 */
示例:
from django.shortcuts import render,HttpResponse from django.views.decorators.csrf import csrf_exempt # Create your views here. import json def login(request): return render(request,‘Ajax.html‘) def ajax_get(request): l=[‘alex‘,‘little alex‘] dic={"name":"alex","pwd":123} #return HttpResponse(l) #元素直接轉成字符串alexlittle alex #return HttpResponse(dic) #字典的鍵直接轉成字符串namepwd return HttpResponse(json.dumps(l)) return HttpResponse(json.dumps(dic))# 傳到前端的是json字符串,要想使用,需要JSON.parse(data) //--------------------------------------------------- function testData() { $.ajax(‘ajax_get‘, { success: function (data) { console.log(data); console.log(typeof(data)); //console.log(data.name); //JSON.parse(data); //console.log(data.name); }, //dataType:"json", } )} 註解:Response Headers的content Type為text/html,所以返回的是String;但如果我們想要一個json對象 設定dataType:"json"即可,相當於告訴ajax方法把服務器返回的數據轉成json對象發送到前端.結果為object 當然, return HttpResponse(json.dumps(a),content_type="application/json") 這樣就不需要設定dataType:"json"了。 content_type="application/json"和content_type="json"是一樣的!
Django 【第十六篇】Ajax基礎