JQueqy Ajax的使用(POST\GET請求 csrf_token)


一,Ajax GET請求和POST請求知識點

  1,GET請求不用添加 {% csrf_token%}  ,也不會報csrftoken的錯

  2,POST請求的話,就需要添加 {% csrf_token%} 標簽, 而且要使用$.ajax() 方法,將token傳遞到服務端

  3,傳遞過去就行了,后台自動會處理,無需用手工處理這個token

二,以下是代碼示例

以下是index.html代碼示例(里面有使用ajax,GET和POST方法的代碼示例)

 

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4   <meta charset="UTF-8">
 5   <meta http-equiv="x-ua-compatible" content="IE=edge">
 6   <meta name="viewport" content="width=device-width, initial-scale=1">
 7   <title>AJAX局部刷新實例</title>
 8 </head>
 9 <body>
10   <!-- 說明,csrf_token其實就是一個input框 ,類型為"hiddent"即隱藏的,如下注釋的代碼 -->
11   <!-- <input type="hidden" name="csrfmiddlewaretoken" value="IQlJvU6mRj3yKXP5YNV3ABZutgHOa546M04dysyQEBNGJ2euDogA8OX0vyLEiy12"> -->
12   {% csrf_token %}
13 <input type="text" id="i1">+
14 <input type="text" id="i2">=
15 <input type="text" id="i3">
16 <input type="button" value="AJAX提交1" id="b1">
17 <input type="button" value="AJAX提交2" id="b2">
18 <!-- 本次代碼新增一個按扭 -->
19 <input type="button" id="b3" value="哥達">
20 <hr>
21 <h1 id="d1">xxxxxxxxxxxx</h1>
22 <!-- 以下是導入JQUERY -->
23 <script src="/static/jquery-3.3.1.js"></script>
24 <!-- 以下是使用jquery版的ajax請求 -->
25 <script>
26 // 添加點擊事件,定義回調函數,當點擊#b1元素時,則執行函數
27   $("#b1").on("click", function () {
28     $.ajax({
29       url:"/ajax_add/", // 要跳轉到哪里,所以就沒有必要再使用form表單的跳轉和提交了
30       type:"GET",  //可以使用POST,或GET都可以
31       data:{"i1":$("#i1").val(),"i2":$("#i2").val()},  //使用jquery獲取DOM元素的值,並傳遞到后端
32       success:function (data) {   //發送AJAX請墳成功后,執行回調函數,data則是獲取的后端數據,
33         $("#i3").val(data);   //給DOM元素設置值
34       }
35     })
36   })
37   // jquery ajax使用 POST方法提交,則必須把CSRF_TOKEN也傳遞到服務器(這樣才是完全和form表單提交的方式一樣)
38   // 如果是使用get方法提交,則就不需要csrf_token,
39   $("#b2").on("click", function () {
40     // 找到頁面上的CSRF_TOKEN,name屬性值應該都一樣,
41     // 使用jquery語法,根據name屬性找到元素,再使用val方法獲取值
42     var csrfToken = $("[name='csrfmiddlewaretoken']").val();
43     $.ajax({
44       url:"/ajax_add2/", // 要跳轉到哪里,所以就沒有必要再使用form表單的跳轉和提交了
45       type:"POST",  //可以使用POST,或GET都可以
46       //使用jquery獲取DOM元素的值,並傳遞數據到后端
47       data:{"i1":$("#i1").val(),"i2":$("#i2").val(),'csrfmiddlewaretoken':csrfToken},
48       success:function (data) {   //發送AJAX請墳成功后,執行回調函數,data則是獲取的后端數據,
49         $("#i3").val(data);   //給DOM元素設置值
50       }
51     })
52   })
53 //以下事件是點擊后使用,使用jqurey創建一個IMG標簽,並添加上,
54   $('#b3').on('click',function(){
55       $.ajax({
56         // url:'/test/',
57         // type:'get',
58         success:function(a){
59           //在頁面上創建一個標簽
60           var myimg=$("<img>").attr('src','/static/1.jpg');
61           $('#d1').append(myimg);
62         }
63       })
64   })
65 
66 </script>
67 </body>
68 </html>
index.html
from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/$',views.index),
    url(r'^ajax_add/$',views.ajax_add),
    url(r'^ajax_add2/$',views.ajax_add2),
]
urls.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.


def index(request):
    return render(request,'index.html')

def ajax_add(request):
    print (request.GET.get('i1'))
    print (request.GET.get('i2'))
    i1=int(request.GET.get('i1'))
    i2=int(request.GET.get('i2'))
    ret=i1+i2
    return HttpResponse(ret)

def ajax_add2(request):
    print (request.POST.get('i1'))
    print (request.POST.get('i2'))
    i1=int(request.POST.get('i1'))
    i2=int(request.POST.get('i2'))
    ret=i1+i2
    return HttpResponse(ret)
views.py處理ajax請求發過來數據

三,知識點

1   <!-- 說明,csrf_token其實就是一個input框 ,類型為"hiddent"即隱藏的,如下注釋的代碼 -->
2   <!-- <input type="hidden" name="csrfmiddlewaretoken" value="IQlJvU6mRj3yKXP5YNV3ABZutgHOa546M04dysyQEBNGJ2euDogA8OX0vyLEiy12"> -->
  // jquery ajax使用 POST方法提交,則必須把CSRF_TOKEN也傳遞到服務器(這樣才是完全和form表單提交的方式一樣)
  // 如果是使用get方法提交,則就不需要csrf_token,

四、使用另一種方式,在ajax POST提交的時候,帶上csrf_token

 

通過獲取返回的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');

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

將以上內容放在一個 xxxx.js的文件,然后在ajax提交的html頁面里,引入這個xxx.js文件即可,

然后ajax提交里面,就不需要再獲取csrfToken的值了,也不需要將此值放在data中傳遞給django來處理了。

<script src="/static/xxx.js" ></script>
// jquery ajax使用 POST方法提交,則必須把CSRF_TOKEN也傳遞到服務器(這樣才是完全和form表單提交的方式一樣)
  // 如果是使用get方法提交,則就不需要csrf_token,
  $("#b2").on("click", function () {
    // 找到頁面上的CSRF_TOKEN,name屬性值應該都一樣,
    // 使用jquery語法,根據name屬性找到元素,再使用val方法獲取值,這里就不再需要了,
   // var csrfToken = $("[name='csrfmiddlewaretoken']").val();
    $.ajax({
      url:"/ajax_add2/", // 要跳轉到哪里,所以就沒有必要再使用form表單的跳轉和提交了
      type:"POST",  //可以使用POST,或GET都可以
      //使用jquery獲取DOM元素的值,並傳遞數據到后端,這里DATA中,也不再需要將 csrfToken寫在data中了,
      data:{"i1":$("#i1").val(),"i2":$("#i2").val()},
      success:function (data) {   //發送AJAX請墳成功后,執行回調函數,data則是獲取的后端數據,
        $("#i3").val(data);   //給DOM元素設置值
      }
    })
  })

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM