2016-01-31 92 views
3

我對Django很新。我的項目名稱是rango,並且我創建了一個名爲「/ rango/tagger」的URL,用於發送對象。禁止(CSRF令牌丟失或不正確)Django錯誤

在我的Java腳本,我試圖通過如下它發送一個Ajax請求與這條路線進行通信:

function send() 
{ 
    obj = {content:$("#content").val()}; 
    $.post('/rango/tagger',obj,function(data){ 
    console.log(data); 
    }) 
} 

我已經包含在模板中的{%csrf_token%}。然而,它給我的錯誤,如下所示:

Forbidden (CSRF token missing or incorrect.): /rango/tagger 
[31/Jan/2016 09:43:29] "POST /rango/tagger HTTP/1.1" 403 2274 

我在views.py功能惡搞如下:

def tagger(request): 
return render(request,'rango/index.html',RequestContext(request)) 

的,我也以我的URL模式定義它。我懷疑我的函數標記器返回一個不正確的值或數據(根據其他SO解決方案從HttpResponse(請求)到上面的行進行更改)。

但是,它似乎並不適合我。我錯在哪裏?

+1

http://stackoverflow.com/問題/ 6506897/csrf-token-missing-or-incorrect-while-post-parameter-via-ajax-in-django – mariodev

+0

另請參閱使用[CSRF with ajax]的官方Django文檔(https://docs.djangoproject。 com/en/1.9/ref/csrf /#ajax) – mhawke

回答

8

Ajax請求必須包括CSRF,因爲它是另一個HTTP請求,那麼請複製此代碼:

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

你之後設置在發送AJAX請求之前設置的CSRF。

source

+0

謝謝你這麼多,它像一個魅力:) – AbbaShareen

+0

太棒了!你搖滾! – MrMins

1

或者你可以在很短的方式做到這一點(不代碼上面寫的),但在發送的輸入字段中的所有數據:

$.post(
    '/rango/tagger', 
    $("#id_of_your_form").serialize(), 
    function(data) { 
     console.log(data); 
    } 
) 
相關問題