2011-12-23 32 views
18

Tôi có 2 trang html.Jquery và Django CSRF Token

Trang gốc và trang con. Trang con chứa một nút gửi chạy mã trên trang cha mẹ để gửi một thông báo Ajax.

Tôi tải trang con bằng cách sử dụng phương thức $ .load() và sau đó khi nút được nhấp, nó chạy phương thức $ .ajax .POST. Phương thức đăng bài này chỉ chuyển một chuỗi JSON tới mã Python.

Khi tôi thực hiện việc này trên bất kỳ trình duyệt nào ngoại trừ IE Nó hoạt động tốt. Tuy nhiên khi tôi chạy mã này trong IE. Tôi nhận được lỗi Python/Django về các thẻ CSRF.

I Hãy suy nghĩ lý do là vì trang con chỉ là làm mới trang hiện tại với mã máy chủ đang chạy.

Có ai biết làm thế nào tôi nên đi về việc này để làm việc.

Chúc mừng,

Trả lời

29

Bạn chưa đi qua CSRF token với POST. Hãy thử làm những gì tôi đã thực hiện trong dữ liệu. Đó là lấy mã thông báo csrf (hoặc phương thức của riêng bạn) và truyền nó vào các đối số của bạn.

$.ajax({ 
    url : url, 
    type: "POST", 
    data : {csrfmiddlewaretoken: document.getElementsByName('csrfmiddlewaretoken')[0].value}, 
    dataType : "json", 
    success: function(data){ 
     // do something 
    } 
}); 
+0

Làm việc giống như một sự quyến rũ. Rất cám ơn :-) – TheMonkeyMan

+4

Cách tiếp cận này là tốt, nhưng nếu bạn đang thực hiện nhiều yêu cầu ajax, bạn có thể thấy thuận tiện hơn khi chuyển mã thông báo CSRF làm tiêu đề thay thế. Để biết thêm thông tin, hãy xem [tài liệu django] (https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax). – Alasdair

+7

Tôi tìm thấy 'dữ liệu: {...,' csrfmiddlewaretoken ':' {{csrf_token}} '}, ... 'đơn giản hơn. – Tuttle

5

Từ docs trên CSRF và AJAX:

Các CSRF thẻ cũng có mặt trong DOM, nhưng chỉ khi nào một cách rõ ràng bao gồm sử dụng csrf_token trong một mẫu. Cookie chứa mã thông báo chuẩn; CsrfViewMiddleware sẽ thích cookie đến mã thông báo trong DOM. Bất kể, bạn được đảm bảo có cookie nếu mã thông báo có trong DOM, do đó, bạn nên sử dụng cookie!

Ví dụ(cũng từ các tài liệu)

// using jQuery 
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'); 

Hoặc bất kỳ cách nào khác để tương tác với các tập tin cookie có thể được sử dụng.

6

Nếu bạn đang gửi nội dung yêu cầu POST, có thể dễ dàng thêm mã thông báo csrf làm tiêu đề yêu cầu thay thế. Tôi thấy cách tiếp cận này dễ đọc hơn, vì nó không làm lộn xộn cơ thể yêu cầu bằng một mã thông báo. Hầu hết yêu cầu AJAX sẽ gửi mã thông báo csrf làm tiêu đề như được đề xuất bởi tài liệu Django.

function startTest(testId) { 
    var payload = JSON.stringify({ 
    test_id : testId 
    }); 
    $.ajax({ 
    url: "/test-service/", 
    method: "POST", 
    headers: {'X-CSRFToken': '{{ csrf_token }}'}, 
    data: payload, 
    dataType: "json" 
    }).done(function(response) { 
    console.log(response.id + " " + response.name); 
    }).fail(function (error) { 
     console.log(error); 
    }); 
} 
Các vấn đề liên quan