Django Ajax "禁止" 错误

16 投票
4 回答
11514 浏览
提问于 2025-04-16 18:37

我看到有些人在尝试进行远程Ajax请求时遇到了禁止访问的错误,但我这边是本地请求,而且我的中间件里也开启了CSRF保护。

errorThrown返回的是“禁止访问”

我觉得问题可能出在我试图把请求发送到一个普通的视图(也就是当前页面)上……我不太确定我的预处理器是不是在返回视图以重新渲染页面,还是直接返回到我当前的页面。(我觉得我没解释清楚)

希望这能让你对发生了什么有个大致的了解。任何帮助都非常感谢。

这是.ajax的代码:

jQuery.ajax({
        type: "POST",
        dataType: "json",
        data: dataString,
        success: function(json) {
              jQuery(".signup").attr('disabled', false);
              $('.success').show();
              console.log(json.message);
        },
        error: function(jqXHR, textStatus, errorThrown) {
              jQuery(".signup").attr('disabled', false);
              $('.fail').show().append(errorThrown);
              console.log(textStatus);
        }

    });

4 个回答

1

好吧,如果你还想要CSRF保护,可以看看我的解决方案。

在我的情况下,我有一个模板,不想在里面放一个 <form></form> 元素。但我还是想用jQuery发起AJAX的POST请求。

我遇到了403错误,因为CSRF的cookie是空的,尽管我按照Django的文档去做了(https://docs.djangoproject.com/en/1.5/ref/contrib/csrf/)。解决方案就在同一页面上,提到了 ensure_csrf_cookie 装饰器。

当我在我的 views.py 文件顶部添加了这个后,我的CSRF cookie就设置好了:

from django.views.decorators.csrf import ensure_csrf_cookie
@ensure_csrf_cookie

另外,请注意,在这种情况下,你 不需要 在你的标记/模板中放置DOM元素: {% csrf_token %}

9

如果你开启了CSRF保护,你可能会遇到403错误。你可以试着在views.py文件里添加一些代码,看看是不是这个原因导致的:

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
view class/method
20

即使请求是发往同一个网站,你也需要一个CSRF令牌。这里有一些代码可以帮助你在使用jQuery的AJAX请求中添加CSRF令牌:

https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/#ajax

这个链接指向的是1.7版本的文档,如果你使用的是不同版本的Django,可以在右下角的浮动菜单中选择你的版本。

撰写回答