Django - 由于 csrf 令牌无法在 Windows 上工作,AJAX 无法工作

Neu*_*ion 2 django ajax

我在 Linux 上开发了我的应用程序并且 AJAX 请求工作正常。我已将应用程序拉到 Windows 机器上,但 AJAX 请求失败,我只是收到 403 Forbidden 错误。从网上看,我认为是csrf令牌的问题。在 Linux 中,我可以csrftoken:"AjQzJy3tRZ2awslgdibkDTvQgANFQKmP"在 AJAX 请求的 Cookies 下看到。我在 Windows 中没有看到任何 cookie 设置。

这是我用来获取 csrf cookie 的 Javascript 代码。它来自https://docs.djangoproject.com/en/1.8/ref/csrf/

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;
}
Run Code Online (Sandbox Code Playgroud)

这是我提交 AJAX 请求的地方:

function refreshInformation(){
$.ajax({
    type: "POST",
    url: "get_flows_info",
    data: {
           csrfmiddlewaretoken: getCookie('csrftoken')
    }
    dataType : "json",
    async : true,
    error : function(data){
        alert('AJAX error:' + data);
    },
    success : function(json_data){
            // do stuff...
    },
}); 
}
Run Code Online (Sandbox Code Playgroud)

这是被请求的视图:

def get_flows_info(request):
    if request.is_ajax():

          # do stuff...

        return HttpResponse(json.dumps(ret), content_type='application/json')
Run Code Online (Sandbox Code Playgroud)

我发现了这一点:Django CSRF 检查因 Ajax POST 请求失败,但 jQuery 没有任何区别。

有什么帮助吗?

谢谢。

Ern*_*Ten 7

这是可以做的:

  1. 检查 CSRF 令牌 cookie 名称。

    有关CSRF_COOKIE_NAME更多信息,请参阅。

  2. ensure_csrf_cookie装饰器添加到您的视图(呈现页面的那个)。

    根据文档

    警告

    如果您的视图未呈现包含csrf_token模板标记的模板,Django 可能不会设置 CSRF 令牌 cookie。这在表单被动态添加到页面的情况下很常见。为了解决这种情况,Django 提供了一个视图装饰器来强制设置 cookie:ensure_csrf_cookie().

  3. 假设 CSRF 令牌 cookie 名称是csrftoken,尝试发送X-CSRFToken标头。

    $.ajax({
        // Your options here.
        headers: {'X-CSRFToken': getCookie('csrftoken')}
    });
    
    Run Code Online (Sandbox Code Playgroud)

阅读跨站点请求伪造保护以获取更多信息。