2011-07-19 47 views
2

我正在通过'Django 1.0网站开发'的方式,并在使用窗体时遇到问题。服务器抱怨有关'csrf'的内容。我可以通过在form-tag后面加上{% csrf_token %}来解决它。我已经阅读了djangoproject.com上的文档,但我不得不承认,我并不完全理解这里发生了什么。我不使用中间件类。http 403与django和AJAX错误

真正的问题出现在我碰到ajax的时候。我跟着书中的指示信,但服务器就开始抱怨:

"POST /save/?ajax HTTP/1.1" 403 2332 

下面是可能导致故障代码:

function bookmark_save() { 
var item = $(this).parent(); 
var data = { 
    url: item.find("#id_url").val(), 
    title: item.find("#id_title").val(), 
    tags: item.find("#id_tags").val() 
}; 
$.post("/save/?ajax", data, function (result) { 
    if (result != "failure") { 
     item.before($("li", result).get(0)); 
     item.remove(); 
     $("ul.bookmarks .edit").click(bookmark_edit); 
    } 
    else { 
     alert("Failed to validate bookmark before saving."); 
    } 
}); 
return false; 

}

“/保存/ & ajax'正在处理中

if ajax: 
    return render_to_response('bookmark_save_form.html', variables) 

这里的bookmark_save_form.h TML:

<form id="save-form" method="post" action="/save/"> 
    {% csrf_token %} 
    {{ form.as_p }} 
    <input type="submit" value="save" /> 
</form> 

据我了解的东西,我必须通过csrf_token与POST请求。但我不知道如何。

任何建议,这将是伟大的。

+0

天上,哎哟。我遇到过这么多次。让我看看是否可以从我之前的一个项目中获得一些代码来帮助你。 – TheChes44

+0

另外,为标签添加python,你会得到更多的意见和帮助解决问题。 – TheChes44

+0

你的urls.py文件对于这种情况如何? –

回答

0

我从一个已经完成的项目中提取了这个。这是一个联系表单模板。请注意,这是django。另请参阅django书http://www.djangobook.com/en/2.0/。我的所有问题都已经被本书回答了。它覆盖了一切。这说明究竟是如何把在CSRF令牌(在模板):

<head> 
    <title>Contact Us</title> 
</head> 
<body> 
    <h1>Contact us</h1> 

{% if form.errors %} 
    <p style="color: red;"> 
     Please correct the error{{ form.errors|pluralize }} below. 
    </p> 
{% endif %} 

<form action="" method="post"> 
    {% csrf_token %} 
    <ul> 
     {{ form.as_ul }} 
    </ul> 
    <input type="submit" value="Submit"> 
</form> 
</body> 

此外,改变你的价值,而不是提交的保存,而不是/保存/行动使用后.. ...可能会使它工作。

+0

不幸的是,这并没有解决我的问题,但我找到了一种方法关闭csrf中间件。我知道防止这种攻击可能是一件好事,但我现在无法处理这类问题。当我对django的理解已经提前时,我会再试一次......感谢您的帮助! – user852303

+0

其实这是一件非常非常好的事情。如果你没有csrf proctction,人们可以玩弄网址并提交他们想要的东西,这可能是错误的数据,或者更糟糕的是代码段可能会导致服务器崩溃。顺便说一句,尝试只渲染而不是渲染到响应。阅读DJANGO书!这里有一个链接,你需要阅读http://www.djangobook.com/zh/2.0/chapter07/。 – TheChes44

-1

创建一个Javascript文件。我不知道如何格式化代码 - 抱歉。然后在Jquery之后加载它。

它被描述here

1

我目前通过这本书的工作,以及跑进了完全相同的问题,BTW。不是第一次!基本上,发生的情况是,csrf标记未通过Ajax请求传递。所以,简单而简单的答案是,您需要包含csrf标记是您的ajax调用。这是通过这个代码块来实现:https://docs.djangoproject.com/en/1.3/ref/contrib/csrf/#ajax

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

我遂把此作为我user_page.html .js文件。之后,我可以不受惩罚地发出Ajax电话!

+0

@Jim,非常感谢您的回答。我实际上是从同一本书中学习,并遇到同样的问题。我尝试了你的解决方案csrfmiddlewaretoken:'{{csrf_token}}',但它仍然给我同样的错误。我还需要在其他地方更换吗?谢谢 – Houman

0

我正在翻阅这本书,并且遇到了同样的问题。这是最简单的解决方案,它具有不禁用Django的csrf保护或不得不包含装饰器或提供诸如“ensure_csrf_cookie”之类的实用程序的好处。它只是通过令牌:

在。js文件创建保存您的自定义的jQuery的脚本,在你的bookmark_save添加以下对你的“数据”中的var()函数:

csrfmiddlewaretoken: document.getElementsByName('csrfmiddlewaretoken')[0].val() 

所以导致bookmark_save功能如下:

function bookmark_save() { 
    var item = $(this).parent(); 
    var data = { 
     url: item.find("#id_url").val(), 
     title: item.find("#id_title").val(), 
     tags: item.find("#id_tags").val(), 
     csrfmiddlewaretoken: document.getElementsByName('csrfmiddlewaretoken')[0].val() 
    }; 
    $.post("/save/?ajax", data, function (result) { 
     if (result != "failure") { 
      item.before($("li", result).get(0)); 
      item.remove(); 
      $("ul.bookmarks .edit").click(bookmark_edit); 
     } 
     else { 
      alert("Failed to validate bookmark before saving."); 
     } 
    }); 
    return false; 
} 
0

从django.views.decorators.csrf进口csrf_exempt

@csrf_exempt 
def my_view(request): 
...