django中使用Ajax

內容:html

1.Ajax原理與基本使用前端

2.Ajax發送get請求jquery

3.Ajax發送post請求ajax

4.Ajax上傳文件django

5.Ajax設置csrf_tokenjson

6.django序列化後端

 

參考:http://www.javashuo.com/article/p-rllqowht-k.htmlcookie

 

1.Ajax原理與基本使用app

關於Ajax的原理及其基本使用,直接看這篇博文便可:http://www.javashuo.com/article/p-phjoqrdl-cd.html函數

 

 

2.Ajax發送get請求

views.py:

 1 # Ajax get請求的後端處理函數
 2 def ajax_add(request):
 3     print(request.GET)
 4     print(request.GET.get("i1"))
 5     print(request.GET.get("i2"))
 6 
 7     i1 = int(request.GET.get("i1"))
 8     i2 = int(request.GET.get("i2"))
 9 
10     ret = i1 + i2
11     return HttpResponse(ret)

前端代碼:

 1 <input type="text" id="i1">+
 2 <input type="text" id="i2">= 3 <input type="text" id="i3"> 4 <input type="button" value="AJAX get提交" id="b1"> 5 6 <script src="/static/jquery-3.3.1.js"></script> 7 <script> 8  $("#b1").on("click", function () { 9 var i1 = $("#i1").val() 10 var i2 = $("#i2").val() 11 // 日後端發數據 12  $.ajax({ 13  url: "/ajax_add/", 14  type: "get", 15  data: {"i1": i1, "i2": i2}, 16  success: function (arg) { 17  {#alert(arg);#} 18 // 把返回的結果填充到 id是i3的input框中 19  $("#i3").val(arg) 20  } 21  }) 22  }) 23 </script>

 

 

3.Ajax發送post請求

views.py:

1 # Ajax post請求的後端處理函數
2 def ajax_add3(request):
3     print(request.POST)
4     print("-" * 120)
5     i1 = int(request.POST.get("i1"))
6     i2 = int(request.POST.get("i2"))
7 
8     ret = i1 + i2
9     return HttpResponse(ret)

前端代碼:

 1 <input type="text" id="i1">+
 2 <input type="text" id="i2">=
 3 <input type="text" id="i3">
 4 <input type="button" value="AJAX post提交" id="b3">
 5 
 6 <script src="/static/jquery-3.3.1.js"></script>
 7 <script src="/static/setupajax.js"></script>
 8 <script>
 9     $("#b3").on("click", function () {
10         var i1 = $("#i1").val()
11         var i2 = $("#i2").val()
12         // 日後端發數據
13         $.ajax({
14             url: "/ajax_add3/",
15             type: "post",
16             data: {"i1": i1, "i2": i2},
17             success: function (arg) {
18                 {#alert(arg);#}
19                 // 把返回的結果填充到 id是i3的input框中
20                 $("#i3").val(arg)
21             }
22         })
23     })
24 </script>

 

 

4.Ajax上傳文件

 1 // 上傳文件示例
 2 $("#b1").click(function () {
 3     var formData = new FormData();
 4     formData.append("csrfmiddlewaretoken", $("[name='csrfmiddlewaretoken']").val());
 5   formData.append("f1", $("#f1")[0].files[0]);
 6     $.ajax({
 7         url: "/upload/",
 8         type: "POST",
 9         processData: false,  // 告訴jQuery不要去處理髮送的數據
10         contentType: false,  // 告訴jQuery不要去設置Content-Type請求頭
11         data: formData,
12         success:function (data) {
13             console.log(data)
14     }
15   })
16 })

 

 

5.Ajax設置csrf_token

(1)經過獲取隱藏的input標籤中的csrfmiddlewaretoken值,放置在data中發送

 1 $.ajax({
 2   url: "/cookie_ajax/",
 3   type: "POST",
 4   data: {
 5     "username": "xxx",
 6     "password": 123456,
 7     // 使用jQuery取出csrfmiddlewaretoken的值,拼接到data中
 8     "csrfmiddlewaretoken": $("[name = 'csrfmiddlewaretoken']").val() 
 9   },
10   success: function (data) {
11     console.log(data)
12   }
13 })

 

(2)經過獲取返回的cookie中的字符串 放置在請求頭中發送

 1 // 引入一個jquery.cookie.js插件,而後寫如下代碼:
 2 
 3 $.ajax({
 4   url: "/cookie_ajax/",
 5   type: "POST",
 6   // 從Cookie取csrftoken,並設置到請求頭中
 7   headers: {"X-CSRFToken": $.cookie('csrftoken')},    
 8   data: {"username": "xxx", "password": 123456},
 9   success: function (data) {
10     console.log(data);
11   }
12 })

或者這樣(推薦這樣寫):

 1 function getCookie(name) {
 2     var cookieValue = null;
 3     if (document.cookie && document.cookie !== '') {
 4         var cookies = document.cookie.split(';');
 5         for (var i = 0; i < cookies.length; i++) {
 6             var cookie = jQuery.trim(cookies[i]);
 7             // Does this cookie string begin with the name we want?
 8             if (cookie.substring(0, name.length + 1) === (name + '=')) {
 9                 cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
10                 break;
11             }
12         }
13     }
14     return cookieValue;
15 }
16 
17 // 在cookie中獲取csrftoken
18 var csrftoken = getCookie('csrftoken');
19 
20 function csrfSafeMethod(method) {
21   // these HTTP methods do not require CSRF protection
22   return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
23 }
24 
25 // 爲每次Ajax請求以前執行該函數
26 // 只要在使用Ajax的地方以前導入便可
27 $.ajaxSetup({
28   beforeSend: function (xhr, settings) {
29     if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
30       xhr.setRequestHeader("X-CSRFToken", csrftoken);
31     }
32   }
33 });

 

注:

若是使用從cookie中取csrftoken的方式,須要確保cookie存在csrftoken值。

若是你的視圖渲染的HTML文件中沒有包含 {% csrf_token %},Django可能不會設置CSRFtoken的cookie。

這個時候須要使用ensure_csrf_cookie()裝飾器強制設置Cookie:

1 django.views.decorators.csrf import ensure_csrf_cookie
2 
3 @ensure_csrf_cookie
4 def login(request):
5     pass

 

 

6.django序列化

(1)什麼是序列化

序列化:將字符串轉換成json格式的數據便於後端將數據發送給前端處理

 

(2)django序列化

使用django內置的serializers進行序列化:

1 from django.core import serializers
2 
3 def books_json(request):
4     book_list = models.Book.objects.all()[0:10]
5     ret = serializers.serialize("json", book_list)
6     return HttpResponse(ret)
相關文章
相關標籤/搜索