2016-01-31 69 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); 
    } 
) 
相关问题