2011-07-19 50 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): 
...