2011-05-31 64 views
6

在Django 1.3中,你現在必須使用csrf甚至與Ajax。 我使用jquery,現在我想將csrf標記添加到$ .post。我怎樣才能做到這一點?我對jquery不是很熟練,所以對它的描述很好。

這是一個評級的應用程序和帖子發送時,點擊一個星星。 我看過django docs,但不明白在我的情況下做什麼。我的代碼如下:

$(function() { 
      $("#avg").children().not(":input").hide(); 
      $("#rating-widget").children().not("select").hide();  

      $caption = $("<span/>"); 

      $("#avg").stars({captionEl: $caption}); 
      $("#rating-widget").stars({ 
       inputType: "select", 
       cancelShow: false, 
       captionEl: $caption, 
       callback: function(ui, type, value){ 
-------------->  $.post($("#rating-widget").attr("action"), {score: value}, function(data){ 

        }); 
       } 
      }); 
       $caption.appendTo("#rating-widget"); 

}); 

應該說JavaScript不在模板中,而是在靜態文件中。 它是最好把它放在一個模板,所以我可以使用{{ csrf_token }}

在此先感謝!

回答

7

將此代碼放在您的函數之前。它會照顧CSRF。

$('html').ajaxSend(function(event, xhr, settings) { 
    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; 
    } 
    if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) { 
     // Only send the token to relative URLs i.e. locally. 
     xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); 
    } 
}); 
+1

我剛剛發現[編輯版本](http://stackoverflow.com/questions/5100539/django -csrf-check-failing-with-an-ajax-post-request)是他們使用ajaxSetup。它爲我工作:)不知道這是那麼容易!謝謝! – tmpethick 2011-06-02 08:43:25

3

django documentation中,您可以找到關於如何在每個ajax請求中自動包含csrf標記的簡單說明!

+0

正如問題中所說:我已經檢查了這個地方,但無法理解它,並將其放入我的代碼中。但是,無論如何,謝謝嘗試幫助:) – tmpethick 2011-06-01 08:12:29

+0

直到我刪除了ajaxSetup中的if語句,並且只有xhr.setRequestHeader(「X-CSRFToken」,csrftoken); – bozdoz 2013-01-11 21:52:38

1

您不必使用表格!只需創建一個綁定到「明星」帖子的函數的新url。例如

(r'^myapp/star-post/(?P<post_id>.*)/$','myapp.views.myview') 

因此,如果你發送一個請求到該URL,它會發現在你的數據庫後,變更爲「出演」領域,並返回到AJAX響應。

然後你可以有一個成功的回調函數,相應地改變CSS(填入星號等)。這樣,您不必擔心CSRF。

但是你可能會問,那麼跨站腳本攻擊呢?那麼,如果您使用cookie驗證的用戶身份驗證,則不必擔心! Aaa和你很好去。

+0

這正是我所做的。問題是我必須將其存儲在數據庫中,並提示我輸入csrf標記。問題出在我將fra 1.2更新爲1.3之後,即使使用ajax,也使用csrf標記。我想知道如何在請求中使用ajax發送csrf標記 – tmpethick 2011-06-01 08:09:39

+0

@tmpethick即使使用csrf_exempt裝飾器? from django.views.decorators.csrf import csrf_exempt – systemizer 2011-06-03 00:09:29

+0

還沒有試圖使用那一個 - 但現在它的工作:) – tmpethick 2011-06-09 09:28:50