Django-ajax

 

複製代碼
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .error{ color:red } </style> </head> <body> <form class="Form"> <p>姓名&nbsp;&nbsp;<input class="v1" type="text" name="username" mark="用戶名"></p> <p>密碼&nbsp;&nbsp;<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>
複製代碼

AJAX常見應用情景

當咱們在百度中輸入一個「老字後,會立刻出現一個下拉列表!列表中顯示的是包含字的4個關鍵字。css

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

  • 整個過程當中頁面沒有刷新,只是刷新頁面中的局部位置而已!
  • 當請求發出後,瀏覽器還能夠進行其餘操做,無需等待服務器的響應!

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

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

AJAX的優缺點

優勢:

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

缺點:

  • 對服務器形成的壓力較大

jquery實現的ajax

複製代碼
{% 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>
複製代碼

view:

View Code
複製代碼
import json,time def index(request): return render(request,"index.html") def handle_Ajax(request): username=request.POST.get("username") password=request.POST.get("password") print(username,password) time.sleep(10) return HttpResponse(json.dumps("Error Data!"))
複製代碼

簡單的使用示例

前端頁面

View Code
複製代碼
{% load static %}
<!DOCTYPE html> <html lang="zh-CN"> <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> <h3>index</h3> <p class="name"></p> <button class="s1">send_ajax</button> <hr> <input type="text" id="n1">+<input type="text" id="n2">=<input type="text" class="sum"> <button class="cal">計算</button> <hr> {% csrf_token %} <h4>校驗用戶名是否存在</h4> <input type="text" id="user"><span></span> <script src="{% static "jquery-3.2.1.min.js" %}"></script> <script> $(".s1").click(function () { // 觸發ajax事件 // ajax的無參請求  $.ajax({ url: "/ajax_handle/", type: "get", success: function (data) { console.log(data); $(".name").text(data) } }) }); // ajax發送參數  $(".cal").click(function () { $.ajax({ url: "/cal/", data: {"num1":$("#n1").val(),"num2":$("#n2").val()}, success: function (data) { $(".sum").val(data) } }) }); $("#user").blur(function () { $.ajax({ url: "/jiaoyan_user/", type: "post", data: { "user":$("#user").val(), "csrfmiddlewaretoken": $("[name='csrfmiddlewaretoken']").val() }, success: function (data) { var data = JSON.parse(data); if (data["is_reg"]){ $("#user").next().text(data["error_msg"]).css("color","red") } } }) }) </script> </body> </html>
複製代碼

後端視圖函數

View Code
複製代碼
from django.shortcuts import render,HttpResponse,redirect # Create your views here. def index(request): return render(request, "index.html") def ajax_handle(request): return HttpResponse("OK") def cal(request): num1 = request.GET.get("num1") num2 = request.GET.get("num2") ret = int(num1) + int(num2) return HttpResponse(str(ret)) def jiaoyan_user(request): response = {"is_reg": True, "error_msg": ""} user = request.POST.get("user") if user == "yuan": response["error_msg"] = "該用戶已經註冊" else: response["is_reg"] = False import json return HttpResponse(json.dumps(response))
複製代碼

$.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對象

             views.py:   json.loads(request.body.decode("utf8"))


######################------------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實例

*/
複製代碼

示例:jquery

View Code
複製代碼
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"是同樣的!
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息