1. 程式人生 > >Django框架詳細介紹---AJAX

Django框架詳細介紹---AJAX

gen -type 大網 ots def username inf cati 結束

一、概述

1.什麽是JSON

  • JSON 指的是 JavaScript 對象表示法(JavaScript Object Notation)
  • JSON 是輕量級的文本數據交換格式
  • JSON 獨立於語言 *
  • JSON 具有自我描述性,更易理解

  JSON 使用 JavaScript 語法來描述數據對象,但是 JSON 仍然獨立於語言和平臺,JSON 解析器和 JSON 庫支持許多不同的編程語言

圖示:JavaScript與Python間JSON支持的數據類型以及相應轉換關系

技術分享圖片

示例:

  真確的Json對象

# 字符串,列表字符串元素、字典中的索引以及字符串值必須是使用雙引號
["zh", "
man"] { "name": "zh", "gender": "man", "age": 18 }

  錯誤的數寫方式以及Json不支持的對象

{ name: "zh", "age": 18}                      // 屬性名必須使用雙引號
["zh", 18, 0xFFF]                            // 不能使用十六進制值
{ "name": "zh", "age": undefined }                // 不能使用undefined
{ "name": "zh",
  "birthday": new Date(Fri, 26 Aug 2011 07:13:10 GMT
), "getName": function() {return this.name;}         // 不能使用函數和日期對象

  JavaScript中JSON的使用

var str = ‘{"name": "zh", "age": 18}‘
// 將JSON字符串轉化成JavaScript對象
var json_str = JSON.parse(str)
// 將JavaScript對象轉化成JSON字符串
var str2 = JSON.stringify(json_str)

2.JSON和XML比較

  JSON 格式於2001年由 Douglas Crockford 提出,目的就是取代繁瑣笨重的 XML 格式,JSON 格式有兩個顯著的優點:書寫簡單,一目了然;符合 JavaScript 原生語法,可以由解釋引擎直接處理,不用另外添加解析代碼,因此,JSON迅速被接受,已經成為各大網站交換數據的標準格式

   JSON 簡單的語法格式和清晰的層次結構明顯要比 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>
XML格式數據 技術分享圖片
{
    "name": "中國",
    "province": [{
        "name": "黑龍江",
        "cities": {
            "city": ["哈爾濱", "大慶"]
        }
    }, {
        "name": "廣東",
        "cities": {
            "city": ["廣州", "深圳", "珠海"]
        }
    }, {
        "name": "臺灣",
        "cities": {
            "city": ["臺北", "高雄"]
        }
    }, {
        "name": "新疆",
        "cities": {
            "city": ["烏魯木齊"]
        }
    }]
}
JSON格式數據

3.什麽是AJAX

  AJAXAsynchronous Javascript And XML),全稱:異步的JavascriptXML”,即使用Javascript語言與服務器進行異步交互,傳輸的數據為XML(當然,傳輸的數據不只是XML),它不是新的編程語言,而是一種使用現有標準的新方法

  AJAX 最大的優點是在不重新加載整個頁面的情況下,可以與服務器交換數據並更新部分網頁內容這一特點給用戶的感受是在不知不覺中完成請求和響應過程)

  AJAX 不需要任何瀏覽器插件,但需要用戶允許JavaScript在瀏覽器上執行:

    •   同步交互,客戶端發出一個請求後,需要等待服務器響應結束後,才能發出第二個請求
    •   異步交互,客戶端發出一個請求後,無需等待服務器響應結束,就可以發出第二個請求

二、應用

1.常見應用

  搜索引擎中輸入關鍵字,自動彈出提示與關鍵字相關的條目

技術分享圖片

  註冊頁面,輸入註冊的用戶名時,網頁會自動將當前輸入的用戶名發送到後端進行重復性校驗

技術分享圖片

  以上過程就是通過AJAX技術,監測用戶與瀏覽器交互時,通過AJAX向服務端提交交互信息,然後服務端進行結果響應等,前端再將返回的結果進行展示,但是在整個過程中頁面並沒有重新加載

2.在AJAX請求中設置csrf_token

  官方文檔:

https://docs.djangoproject.com/en/1.11/ref/csrf/

  方法一:獲取隱藏在input標簽中的csrfmiddlewaretoken值,並直接添加到AJAX請求的data中發送出去


$.ajax({
url: "/auth/login/",
type: "POST",
data: {
username: $("#id_username").val(),
password: $("#id_password").val(),
// 用JQuery取出csrfmiddlewaretoken的值,添加到data中
csrfmiddlewaretoken:
$("[name = ‘csrfmiddlewaretoken‘]").val(),
},
success: function (data) {
// 判斷傳過來的data字典裏的code是 0 還是 1
// 是 0 說明認證成功以及輸入的驗證碼正確
if (!data.code) {
location.href = data.data;
}
// 是 1 說明認證失敗或者輸入的驗證碼錯誤
else {
// 有錯誤
$("#login-error").text(data.data);
}
},
});

  方法二:從返回的cookie中獲取csrftoken值,並該值添加到AJAX的請求頭中

強調:該方法需要調用jquery.cookie.js插件

<script src="/static/jquery.cookie.js"></script>

$.ajax({
url: "/auth/login/",
type: "POST",
// 從cookie取csrf_token,並添加到AJAX請求頭        
headers: {"X-CSRFToken": $.cookie(‘csrftoken‘)},  
data: {
    username: $("#id_username").val(),
    password: $("#id_password").val(),
},
success: function (data) {
    // 判斷傳過來的data字典裏的code是 0 還是 1
    // 是 0 說明認證成功以及輸入的驗證碼正確
    if (!data.code) {
        location.href = data.data;
    }
    // 是 1 說明認證失敗或者輸入的驗證碼錯誤
    else {
        // 有錯誤
        $("#login-error").text(data.data);
    }
},
});

  方法三:使用$.ajaxSetup()方法統一設置AJAX請求,同時為提高頁面的可讀性可將該方法寫入js文件中直接導入

<!-- 引入Ajax文件 -->
<script src="/static/setupAjax.js"></script>

  js文件內容

// 自定義從cookie中獲取csrftoken的方法
function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie !== ‘‘) {
        var cookies = document.cookie.split(‘;‘);
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) === (name + ‘=‘)) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}
var csrftoken = getCookie(‘csrftoken‘);

function csrfSafeMethod(method) {
  // these HTTP methods do not require CSRF protection
  return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}

$.ajaxSetup({
  beforeSend: function (xhr, settings) {
    // 如果發送的是POST請求則設置請求頭,添加  CSRFToken
    if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
      xhr.setRequestHeader("X-CSRFToken", csrftoken);
    }
  }
});

3.示例

  登錄頁面設計,當光標停留在輸入用戶名的input框時,不斷通過AJAX向後端提交當前輸入的用戶名,後端進行校驗該用戶是否存在並返回響應

// 檢測用戶輸入的用戶名,一旦存在輸入就發送到後端校驗用戶是否存在
$("#id_username").on("input", function () {
$("#check-user").text("");
var username = $(this).val();
$.ajax({
url: "/auth/check_user/",
type: "POST",
data: {
username: username,
},
success: function (data) {
if (data.code){
// 用戶已存在
$("#check-user").text("用戶已存在");
}
}
})
});

補充知識:

  1) Django內置的序列化serializers

  2)SweetAler插件

https://lipis.github.io/bootstrap-sweetalert/

Django框架詳細介紹---AJAX