Jquery Django页面上的AJAX调用将导致403禁止,但不会导致Chrome
我对Django中的CSRF令牌机制有一个问题,这个问题只出现在Firefox和Internet Explorer中(Chrome似乎工作得很好)。我的站点提供一个页面,该页面在Jquery Django页面上的AJAX调用将导致403禁止,但不会导致Chrome,jquery,ajax,django,nginx,csrf,Jquery,Ajax,Django,Nginx,Csrf,我对Django中的CSRF令牌机制有一个问题,这个问题只出现在Firefox和Internet Explorer中(Chrome似乎工作得很好)。我的站点提供一个页面,该页面在ready()就绪后执行AJAX调用。当发出AJAX调用时,我得到一个403禁止错误,表明CSRF验证失败。请求被中止。错误页面给出的原因是未设置CSRF cookie 我已经看过了,我正在遵循公认的答案。但是,我仍然看到三分之二的浏览器存在问题 当我检查此调用的标题时,我看到csrftoken设置正确,但该值与页面中设
ready()
就绪后执行AJAX调用。当发出AJAX调用时,我得到一个403禁止错误,表明CSRF验证失败。请求被中止。错误页面给出的原因是未设置CSRF cookie
我已经看过了,我正在遵循公认的答案。但是,我仍然看到三分之二的浏览器存在问题
当我检查此调用的标题时,我看到csrftoken
设置正确,但该值与页面中设置的值不匹配!
(我错误地认为这些值不匹配。Firefox中的“查看源代码”选项显然会重新加载页面,而不是显示您正在查看的页面的源代码。)
我的服务器是通过以下方式设置的,尽管目前我正在Postgres上使用SQLite当令牌正确传递时,为什么会出现403个错误?
以下是我的AJAX调用:
$.ajax({
beforeSend: function(xhr, settings) {
csrftoken = getCookie('csrftoken');
if(!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
},
url: "{% url 'cap_plan:ajax_get_chart_data' %}",
type: "POST",
success: drawChart,
error: function(xhr, errmsg, err) {
// TODO: Do something better in the error case
console.log("AJAX Error!");
console.log(xhr.status + ": " + xhr.responseText);
}
});
getCookie()
和csrfSafeMethod
例程与中列出的例程完全相同
以下是用于此调用的URL规则:
url(r'^ajax/get_chart_data/$', ajax_get_chart_data, name='ajax_get_chart_data'),
下面是整个页面各自视图的简化视图:
@ensure_csrf_cookie
def cap_plan_overview(request):
return render_to_response('cap-plan-overview.html',
{}, context_instance=RequestContext(request))
以及AJAX调用本身的视图(再次简化):
复制品?检查这个:我发现了这个问题,我的代码实现了被接受的确切解决方案,但我仍然得到403。我的问题似乎也与浏览器有关,原因我不明白-(嗯,在ajax调用中执行任何操作之前,您是否添加了该答案($.ajaxSetup…)中的全部代码?根据官方jQuery文档,使用
ajaxSetup(),您应该有这些代码来设置ajax,然后再执行ajax调用(但是从$.ajax中删除beforeSend,它应该在$.ajaxSetup中)不建议使用函数。调用ajax()
函数允许您在每次调用发送函数之前设置一个,这就是我在这里所做的。为什么不建议使用此函数?我使用ajaxSetup()而不是ajax(),而且我的代码几乎没有403。
def ajax_get_chart_data(request):
if request.method == 'POST':
// Do a bunch of work getting data; put it in the response dict
return HttpResponse(
json.dumps(response),
content_type="application/json"
)
else:
return HttpResponse(
json.dumps({error: "Invalid AJAX call to ajax_get_chart_data"}),
content_type="application/json"