Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery Django页面上的AJAX调用将导致403禁止,但不会导致Chrome_Jquery_Ajax_Django_Nginx_Csrf - Fatal编程技术网

Jquery Django页面上的AJAX调用将导致403禁止,但不会导致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设置正确,但该值与页面中设

我对Django中的CSRF令牌机制有一个问题,这个问题只出现在Firefox和Internet Explorer中(Chrome似乎工作得很好)。我的站点提供一个页面,该页面在
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"