我无法通过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
装饰功能,但它没有帮助。我已经尝试将其添加到我的代码中:
$.ajaxSetup({
data: {csrfmiddlewaretoken: '{{ csrf_token }}' },
});
它也没有帮助。
我完成了文档中描述的内容:https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/
但是有一个错误$.cookie
不是一个功能。为了解决这个问题,我将csrf cookie插件下载到我的静态目录或将其添加到我的模板<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js"></script>
,但仍然是同样的错误。
答案 0 :(得分:1)
您可以在表单中添加{%csrf_token%}模板标签或在帖子中发布帖子,如果您想避免错误,可以使用decorater @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/
答案 1 :(得分:0)
要使用ajax考虑CSRF,请尝试遵循Django docs建议通过JS获取令牌:https://docs.djangoproject.com/en/1.9/ref/csrf/#ajax
使用以下命令创建一个名为csrf.js的JS文件(假设是jQuery):
// 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');
包含 包含你的ajax JS的模板上的JS文件。
然后你应该能够安全地做你需要的事。
答案 2 :(得分:0)
我也面临着同样的问题,但问题得到了解决。
信息: 我有一个基本的联系表单,可以向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');
}
});
答案 3 :(得分:-1)
当您在模板中使用csrfmiddlewaretoken时,使用 {%csrf_token%} ,即包含在html正文中的某个位置。 {%csrf_token%}被评估为
<input type="hidden" name="csrfmiddlewaretoken" value="somevalue">
然后,您可以使用jquery查找此特定隐藏字段并检索其值并将其传递给您的ajax调用。