Django CSRF检查因Ajax POST请求而失败

火炉

我可以通过我的AJAX帖子向遵循Django的CSRF保护机制的人员提供帮助。我按照这里的指示进行:

http://docs.djangoproject.com/en/dev/ref/contrib/csrf/

我已经完全复制了该页面上的AJAX示例代码:

http://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax

getCookie('csrftoken')xhr.setRequestHeader呼叫之前打印了警报,并打印了的内容,确实在其中填充了一些数据。我不确定如何验证令牌是否正确,但是我鼓励它正在查找并发送一些消息。

但是Django仍然拒绝我的AJAX帖子。

这是我的JavaScript:

$.post("/memorize/", data, function (result) {
    if (result != "failure") {
        get_random_card();
    }
    else {
        alert("Failed to save card data.");
    }
});

这是我在Django中看到的错误:

[23 / Feb / 2011 22:08:29]“ POST / memorize / HTTP / 1.1” 403 2332

我确定我缺少某些东西,也许很简单,但是我不知道它是什么。我搜索了SO,并看到了一些有关通过csrf_exempt装饰器关闭CSRF检查以获取我的视图的信息,但是我发现这并不吸引人。我已经尝试过了,并且可以工作,但是我宁愿让POST按照Django预期的方式工作。

以防万一,这是我的观点正在做的要点:

def myview(request):

    profile = request.user.profile

    if request.method == 'POST':
        """
        Process the post...
        """
        return HttpResponseRedirect('/memorize/')
    else: # request.method == 'GET'

        ajax = request.GET.has_key('ajax')

        """
        Some irrelevent code...
        """

        if ajax:
            response = HttpResponse()
            profile.get_stack_json(response)
            return response
        else:
            """
            Get data to send along with the content of the page.
            """

        return render_to_response('memorize/memorize.html',
                """ My data """
                context_instance=RequestContext(request))

多谢您的回覆!

雅各布·古克拉夫斯基(JakubGocławski):

真正的解决方案

好的,我设法找出问题所在。它位于Javascript(如我在下面建议的那样)代码中。

您需要的是:

$.ajaxSetup({ 
     beforeSend: function(xhr, settings) {
         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;
         }
         if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
             // Only send the token to relative URLs i.e. locally.
             xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
         }
     } 
});

而不是官方文档中发布的代码:https//docs.djangoproject.com/en/2.2/ref/csrf/

工作代码来自以下Django条目:http : //www.djangoproject.com/weblog/2011/feb/08/security/

因此,一般的解决方案是:“使用ajaxSetup处理程序而不是ajaxSend处理程序”。我不知道为什么会这样。但这对我有用:)

以前的帖子(无答案)

我实际上遇到了同样的问题。

它在更新到Django 1.2.5之后发生-在Django 1.2.4中AJAX POST请求没有错误(AJAX不受任何保护,但效果很好)。

就像OP一样,我尝试了Django文档中发布的JavaScript代码段。我正在使用jQuery 1.5。我也在使用“ django.middleware.csrf.CsrfViewMiddleware”中间件。

我尝试遵循中间件代码,但我知道它在此方面失败:

request_csrf_token = request.META.get('HTTP_X_CSRFTOKEN', '')

然后

if request_csrf_token != csrf_token:
    return self._reject(request, REASON_BAD_TOKEN)

此“如果”为true,因为“ request_csrf_token”为空。

基本上,这意味着未设置标头。那么此JS行有什么问题吗:

xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));

我希望所提供的详细信息将有助于我们解决问题:)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Django中处理AJAX POST请求

如何将Django的CSRF令牌添加到jQuery POST请求的标头中?

CSRF验证失败-Django

CSRF验证失败。请求中止-Django,POST

django db迁移因postgres而失败

AJAX Post请求未将值发送到Django View

Django AJAX POST请求中的JSON数据解析

CSRF验证失败。请求中止。(禁止(403))DJANGO

Django CSRF验证失败

Django Ajax POST请求:内部服务器错误

无法为Django POST请求将CSRF令牌添加到XMLhttpRequest

无法使用Django rest框架提交发布请求(“详细信息”:“ CSRF失败:CSRF令牌丢失或不正确。”)

Django Ajax发布请求

Django CSRF验证失败。请求中止。-未设置CSRF cookie

带有AngularJS的POST请求因预检OPTION状态代码= 404和CodeIgniter ResetServer而失败

错误:“ CSRF验证失败。请求中止。” 当与Django一起使用jquery json时

CSRF验证失败。请求中止(Django中的总初学者)

跨源ajax“ POST”请求失败

django CSRF验证失败。请求中止

CSRF验证在Django中失败

印前检查请求因window.fetch api而失败

CSRF验证失败。请求中止。Django的

为什么 AJAX POST 请求失败?

如何为 Django 服务器的 python POST 请求获取 csrf 令牌

如何从 Django 中的 Javascript 访问 Ajax POST 请求

Angular 和 Django 文件上传:禁止 (403) CSRF 验证失败。请求中止

Django 中 Ajax POST 请求中的外键

Django AJAX:尝试在 POST 请求中传递列表时出错

通过 AJAX 传递 POST 请求,Django 问题