<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Worth Waiting For

      AJAX

      相關準備

      說起json,我們大家都了解,就是python中的json模塊,那么json模塊具體是什么呢?那我們現在詳細的來說明一下

      JSION是什么

      1、JSON(Javascript  Obiect  Notation,JS對象標記)是一種輕量級的數據交換格式。

      它基于 ECMAScript (w3c制定的js規范)的一個子集,采用完全獨立于編程語言的文本格式來存儲和表示數據。
      簡潔和清晰的層次結構使得 JSON 成為理想的數據交換語言。 易于人閱讀和編寫,同時也易于機器解析和生成,并有效地提升網絡傳輸效率。

      2、JSON其實是從js中拿出來的一個對象,也可以說json是js的一個子集。

      PS: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表示中國部分省市數據如下:

       1 <?xml version="1.0" encoding="utf-8"?>
       2 <country>
       3     <name>中國</name>
       4     <province>
       5         <name>黑龍江</name>
       6         <cities>
       7             <city>哈爾濱</city>
       8             <city>大慶</city>
       9         </cities>
      10     </province>
      11     <province>
      12         <name>廣東</name>
      13         <cities>
      14             <city>廣州</city>
      15             <city>深圳</city>
      16             <city>珠海</city>
      17         </cities>
      18     </province>
      19     <province>
      20         <name>臺灣</name>
      21         <cities>
      22             <city>臺北</city>
      23             <city>高雄</city>
      24         </cities>
      25     </province>
      26     <province>
      27         <name>新疆</name>
      28         <cities>
      29             <city>烏魯木齊</city>
      30         </cities>
      31     </province>
      32 </country>
      View Code

      用JSON表示如下:

      1 {
       2     "name": "中國",
       3     "province": [{
       4         "name": "黑龍江",
       5         "cities": {
       6             "city": ["哈爾濱", "大慶"]
       7         }
       8     }, {
       9         "name": "廣東",
      10         "cities": {
      11             "city": ["廣州", "深圳", "珠海"]
      12         }
      13     }, {
      14         "name": "臺灣",
      15         "cities": {
      16             "city": ["臺北", "高雄"]
      17         }
      18     }, {
      19         "name": "新疆",
      20         "cities": {
      21             "city": ["烏魯木齊"]
      22         }
      23     }]
      24 }
      View Code

      可以看到,JSON 簡單的語法格式和清晰的層次結構明顯要比 XML 容易閱讀,并且在數據交換方面,由于 JSON 所使用的字符要比 XML 少得多,可以大大得節約傳輸數據所占用得帶寬。

      注意:

      JSON格式取代了xml給網絡傳輸帶來了很大的便利,但是卻沒有了xml的一目了然,尤其是json數據很長的時候,我們會陷入繁瑣復雜的數據節點查找中。
      但是國人的一款在線工具 BeJson 、SoJson在線工具讓眾多程序員、新接觸JSON格式的程序員更快的了解JSON的結構,更快的精確定位JSON格式錯誤。

      AJAX

      簡單介紹

      前端向后端發送數據的方式:

      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">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>AJAX局部刷新實例</title>
      </head>
      <body>
      
      <input type="text" id="i1">+
      <input type="text" id="i2">=
      <input type="text" id="i3">
      <input type="button" value="AJAX提交" id="b1">
      
      <script src="/static/jquery-3.2.1.min.js"></script>
      <script>
        $("#b1").on("click", function () {
          $.ajax({
            url:"/ajax_add/",
            type:"GET",
            data:{"i1":$("#i1").val(),"i2":$("#i2").val()},
            success:function (data) {
              $("#i3").val(data);
            }
          })
        })
      </script>
      </body>
      </html>
      HTML代碼
      def ajax_demo1(request):
          return render(request, "ajax_demo1.html")
      
      
      def ajax_add(request):
          i1 = int(request.GET.get("i1"))
          i2 = int(request.GET.get("i2"))
          ret = i1 + i2
          return JsonResponse(ret, safe=False)
      Views.py
      urlpatterns = [
          ...
          url(r'^ajax_add/', views.ajax_add),
          url(r'^ajax_demo1/', views.ajax_demo1),
          ...   
      ]
      urls.py

      ajax的創建應用場景

      當我們在百度中輸入一個“老字后,會馬上出現一個下拉列表!列表中顯示的是包含“老字的4個關鍵字。

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

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

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

      • 整個過程中頁面沒有刷新,只是局部刷新了;
      • 在請求發出后,瀏覽器不用等待服務器響應結果就可以進行其他操作;

      ajax的優缺點

      優點:

      AJAX使用Javascript技術向服務器發送異步請求;
      AJAX無須刷新整個頁面;
      因為服務器響應內容不再是整個頁面,而是頁面中的局部,所以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實例
      
      */

      示例:

      1 from django.shortcuts import render,HttpResponse
       2 from django.views.decorators.csrf import csrf_exempt
       3 # Create your views here.
       4 
       5 import json
       6 
       7 def login(request):
       8 
       9     return render(request,'Ajax.html')
      10 
      11 
      12 def ajax_get(request):
      13 
      14     l=['alex','little alex']
      15     dic={"name":"alex","pwd":123}
      16 
      17     #return HttpResponse(l)      #元素直接轉成字符串alexlittle alex
      18     #return HttpResponse(dic)    #字典的鍵直接轉成字符串namepwd
      19     return HttpResponse(json.dumps(l))
      20     return HttpResponse(json.dumps(dic))# 傳到前端的是json字符串,要想使用,需要JSON.parse(data)
      21 
      22 //---------------------------------------------------
      23     function testData() {
      24 
      25         $.ajax('ajax_get', {
      26            success: function (data) {
      27            console.log(data);
      28            console.log(typeof(data));
      29            //console.log(data.name);
      30            //JSON.parse(data);
      31            //console.log(data.name);
      32                                      },
      33            //dataType:"json",
      34                             }
      35                        )}
      36 
      37 注解:Response Headers的content Type為text/html,所以返回的是String;但如果我們想要一個json對象
      38     設定dataType:"json"即可,相當于告訴ajax方法把服務器返回的數據轉成json對象發送到前端.結果為object
      39     當然,
      40         return HttpResponse(json.dumps(a),content_type="application/json")
      41 
      42     這樣就不需要設定dataType:"json"了。
      43     content_type="application/json"和content_type="json"是一樣的!
      View Code

      AJAX請求如何設置csrf_token

      方式1

      通過獲取隱藏的input標簽中的csrfmiddlewaretoken值,放置在data中發送。

      $.ajax({
        url: "/cookie_ajax/",
        type: "POST",
        data: {
          "username": "Q1mi",
          "password": 123456,
          "csrfmiddlewaretoken": $("[name = 'csrfmiddlewaretoken']").val()  // 使用JQuery取出csrfmiddlewaretoken的值,拼接到data中
        },
        success: function (data) {
          console.log(data);
        }
      })

      方式2

      通過獲取返回的cookie中的字符串 放置在請求頭中發送。

      注意:需要引入一個jquery.cookie.js插件。

      $.ajax({
        url: "/cookie_ajax/",
        type: "POST",
        headers: {"X-CSRFToken": $.cookie('csrftoken')},  // 從Cookie取csrf_token,并設置ajax請求頭
        data: {"username": "Q1mi", "password": 123456},
        success: function (data) {
          console.log(data);
        }
      })

      或者用自己寫一個getCookie方法:

      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');

      每一次都這么寫太麻煩了,可以使用$.ajaxSetup()方法為ajax請求統一設置。

      function csrfSafeMethod(method) {
        // these HTTP methods do not require CSRF protection
        return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
      }
      
      $.ajaxSetup({
        beforeSend: function (xhr, settings) {
          if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
          }
        }
      });

      CSRF詳見官方文檔

      序列化

      Django內置的serializers

      def books_json(request):
          book_list = models.Book.objects.all()[0:10]
          from django.core import serializers
          ret = serializers.serialize("json", book_list)
          return HttpResponse(ret)

      我們的數據中經常有日期時間,也就是datetime對象,而json.dumps是無法處理這樣在類型的,那就需要通過自定義處理器來做擴展,如下:

      class JsonCustomEncoder(json.JSONEncoder):
          """
          自定義一個支持序列化時間格式的類
          """
      
          def default(self, o):
              if isinstance(o, datetime):
                  return o.strftime("%Y-%m-%d %H:%M:%S")
              elif isinstance(o, date):
                  return o.strftime("%Y-%m-%d")
              else:
                  return json.JSONEncoder.default(self, o)
      
      
      def books_json(request):
          book_list = models.Book.objects.all().values_list("title", "publish_date")
          ret = json.dumps(list(book_list), cls=JsonCustomEncoder)
          return HttpResponse(ret)

      SweetAlert插件示例

      點擊下載Bootstrap-sweetalert項目

      $(".btn-danger").on("click", function () {
        swal({
          title: "你確定要刪除嗎?",
          text: "刪除可就找不回來了哦!",
          type: "warning",
          showCancelButton: true,
          confirmButtonClass: "btn-danger",
          confirmButtonText: "刪除",
          cancelButtonText: "取消",
          closeOnConfirm: false
          },
          function () {
            var deleteId = $(this).parent().parent().attr("data_id");
            $.ajax({
              url: "/delete_book/",
              type: "post",
              data: {"id": deleteId},
              success: function (data) {
                if (data.status === 1) {
                  swal("刪除成功!", "你可以準備跑路了!", "success");
                } else {
                  swal("刪除失敗", "你可以再嘗試一下!", "error")
                }
              }
            })
          });
      })

       

      posted on 2018-04-08 19:42  WorthWaitingFor  閱讀(183)  評論(0)    收藏  舉報

      導航

      主站蜘蛛池模板: 色99久久久久高潮综合影院| 日本精品一区二区不卡| 亚洲成人www| 精品国产免费一区二区三区香蕉| 国产又爽又黄又无遮挡的激情视频| 国99久9在线 | 免费| 亚洲精品美女久久7777777| 中文字幕一区二区三区久久蜜桃| 久久大香伊蕉在人线免费AV| 国产精品国三级国产av| 亚洲精品国产美女久久久| 同性男男黄gay片免费| 人妻中文字幕精品系列| 国产精品高清视亚洲乱码| 高中女无套中出17p| 国产情侣激情在线对白| 蜜臀av一区二区三区日韩| 成人福利一区二区视频在线| 色综合欧美亚洲国产| 日韩中文字幕有码av| 中国老熟女重囗味hdxx| 奇米影视7777久久精品| 人妻少妇无码精品专区| 极品尤物一区二区三区| 网友偷拍视频一区二区三区| 亚洲成人资源在线观看| 久久精品无码中文字幕| 久久国产热这里只有精品| 国产不卡一区二区在线| 中文字幕日韩精品有码视频| 精品国产一区二区三区性色| gogo无码大胆啪啪艺术| 国产成人精品a视频一区| 亚洲国产亚洲国产路线久久| 最新国产AV最新国产在钱| 防城港市| 亚洲欧美日韩综合久久| 中文人妻AV大区中文不卡 | 亚洲国产aⅴ成人精品无吗| 亚洲欧美日韩精品久久亚洲区| 国产丰满乱子伦无码专区|