2011-11-30 57 views
1

我在使用Django CSRF与Ajax时遇到问题。我得到一个403禁止。我已经完成了所有CSRF的事情,我通常使用非Ajax请求来做,但我仍然有这个问题。我认为这与https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax的JavaScript代码有关。Django CSRF与ajax失败

$(document).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; 
    } 
    function sameOrigin(url) 
    { 
     // url could be relative or scheme relative or absolute 
     var host = document.location.host; // host + port 
     var protocol = document.location.protocol; 
     var sr_origin = '//' + host; 
     var origin = protocol + sr_origin; 
     // Allow absolute or scheme relative URLs to same origin 
     return (url == origin || url.slice(0, origin.length + 1) == origin + '/') || 
      (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') || 
      // or any other URL that isn't scheme relative or absolute i.e relative. 
      !(/^(\/\/|http:|https:).*/.test(url)); 
    } 
    function safeMethod(method) 
    { 
     return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 
    } 
    if (!safeMethod(settings.type) && sameOrigin(settings.url)) 
    { 
     xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); 
    } 
}); 

我目前没有使用这个片段中,主要是因为我不明白一个字,我不知道如何将其纳入我的jquery ajax调用:

function submit_search() 
{ 
    $.ajax({ 
      data:  {query: document.search_form.query.value}, 
      datatype: 'json', 
      success: function(data, textStatus, XMLHttpRequest) 
         { 
          if (data) 
          { 
          if (check_authentication(data)) 
          { 
           $("#results").html(""); 
           var results = data[0]; 
           var length = data[1]; 
           for (var index = 0; index < results.length; ++index) 
           { 
            var result = results[index]; 
            $("#results").append("<p><a href='/entities/" + result["id"] + "'>" + result["name"] + 
                 "</a><br />" + result["description"] + "</p>"); 
           } 
          } 
          else 
          { 
           offer_login(); 
          } 
          } 
         }, 
      type:  'POST', 
      url:  '/ajax/search', 
      }); 
} 

有谁知道我应该如何去添加这段代码到我的代码?

也试过:

$.ajaxSetup({ 
    beforeSend: function(xhr, settings) { 
     if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) { 
      // Only send the token to relative URLs i.e. locally. 
      xhr.setRequestHeader("X-CSRFToken", 
           $("#csrfmiddlewaretoken").val()); 
     } 
    } 
}); 

但这也似乎没有工作,虽然我不知道我是否应该做一些对位大约在我的形式#csrfmiddlewaretoken

感谢

回答

3

您需要做的就是粘贴代码块,使代码在其中运行。如果你有一个全局的JS文件,你应该能够将该JavaScript添加到所述文件的末尾,并且它将解决该问题。

+0

谢谢我没有意识到这很简单。我现在已经发展到内部服务器错误。 – Superdooperhero

+1

@Superdooheroro“即使在a **中踢了一步是前进的一步”:) –

1

好,需要几个步骤,在https://docs.djangoproject.com/en/dev/ref/contrib/csrf/

陈述总结了繁琐的Django的文档,你将需要:1。 安装jquery.cookie插件 2.确保crsf_token被绕过

例如,在你的模板,表单必须包含以下隐藏字段

<input type="hidden" name="csrfmiddlewaretoken" value="{{csrf_token}}"/> 

在你的Ajax请求,你应该这样类似的事情一样

csrf_token = $.cookie('csrftoken'); 
$.ajax({ 
    url: '/url/', 
      type: 'POST', 
      beforeSend: function(xhr, settings) { 
       xhr.setRequestHeader("X-CSRFToken", csrf_token); 
      }, 
      data: $('.form').serialize(), //assume you are submit a form 
}).done(function(response){ 
     console.log(response) 
}); 

一个,你可能会丢失小花招是,您的目标网页(非Ajax)将需要@csrf_protect装饰设置cookie的,如果你不这样做,cookie将不存在,该方法将失败。如果您不想执行@csrf_protect装饰器,则始终可以引用该文档并专门设置cookie。无论哪种方式将工作。

希望这会有所帮助。

+0

你救了我的一天的人 –