1. 程式人生 > >Django 【第十六篇】Ajax基礎

Django 【第十六篇】Ajax基礎

jquery 使用 ror code 語法 表示 是什麽 程序 發送信息

一、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:也是前端向後端發送數據的一種方式

AJAXAsynchronous Javascript And XML)翻譯成中文就是異步JavascriptXML”。即使用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基礎