[英]Forbidden 403 during CSRF check with an AJAX POST request in Django
我無法通過 CSRF 檢查解決問題。 你能告訴我我需要做什么嗎? 這是我在 views.py 中的函數:
@login_required
def like_day(request):
if request.method == 'POST':
if 'day_id' in request.POST:
day_id = request.POST['day_id']
if day_id:
day = Day.objects.get(id=int(day_id))
likes = day.likes + 1
day.likes = likes
day.save()
return HttpResponse(likes)
這是 AJAX 請求:
$(document).ready( function(){
$('#likes2').click(function(){
var catid;
protect
catid = $(this).attr("data-catid");
$.post('/friends_plans/like_day/', {day_id: catid}, function(data){
$('#like_count').html(data);
$('#likes2').hide();
});
});
});
我曾嘗試@ensure_csrf_cookie
函數使用@ensure_csrf_cookie
裝飾器,但它沒有幫助。 我試圖將其添加到我的代碼中:
$.ajaxSetup({
data: {csrfmiddlewaretoken: '{{ csrf_token }}' },
});
它也沒有幫助。 我已經按照文檔中的描述完成了: https : $.cookie
但后來有一個錯誤$.cookie
is not a function。 為了解決這個問題,我將 csrf cookie 插件下載到我的靜態目錄或將其添加到我的模板<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js"></script>
,但還是同樣的錯誤。
您可以在您的表單或發布功能中添加 {% csrf_token %} 模板標簽,如果您想避免錯誤,您可以使用裝飾器@csrf_exempt
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def hello(request):
if request.is_ajax():
print "hello is working fine"
更多細節: https : //docs.djangoproject.com/en/1.7/ref/contrib/csrf/
要使用 ajax 解釋 CSRF,請嘗試按照 Django 文檔建議通過 JS 獲取令牌: https : //docs.djangoproject.com/en/1.9/ref/csrf/#ajax
使用以下內容(假設使用 jQuery)創建一個名為 csrf.js 的 JS 文件:
// 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');
將該 JS 文件包含在包含 ajax JS 的模板中。
然后,您應該能夠安全地做您需要的事情。
我也遇到了同樣的問題,不過已經解決了。
信息:我有一個基本的聯系表格,它向 Django View '/contact-form' 發出 POST 請求。 但它給出了“403 Forbidden”錯誤。 HTML如下:
<form method="post">
{% csrf_token %}
<input>...</input>
<button id="contact-form" type="submit"> <span>Envoyer</span</button>
</form>
原因:它說 Django Url 受任何偽造保護,您應該在 Ajax 調用中包含 CSRF 令牌。
解決方案: 1)在發出 Ajax 請求之前獲取 CSRF 令牌,如下所示:
var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val();
2)然后在你的 Ajax 請求頭中包含 csrftoken,如下所示:
jQuery.ajax({
type: "POST",
url: "/contact-form/",
headers: {
'X-CSRFToken': csrftoken
},
data: data,
success: function() {
alert('success');
}
});
當您在模板中使用 csrfmiddlewaretoken 時,您使用{% csrf_token %}即包含在您的 html 正文中的某處。 {% csrf_token %} 被評估為
<input type="hidden" name="csrfmiddlewaretoken" value="somevalue">
然后,您可以使用 jquery 查找此特定隱藏字段並檢索其值並將其傳遞到您的 ajax 調用中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.