小编典典

Django-由于csrf令牌在Windows上不起作用,AJAX不起作用

ajax

我在Linux上开发了我的应用程序,并且AJAX请求工作正常。我已经将应用程序拉到Windows机器上,但是AJAX请求失败,我刚收到403Forbidden错误。从网上看,我认为这是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;
}

这是我提交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...
    },
}); 
}

这是所请求的视图:

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

          # do stuff...

        return HttpResponse(json.dumps(ret), content_type='application/json')

有什么帮助吗?

谢谢。


阅读 178

收藏
2020-07-26

共1个答案

小编典典

这是可以做的:

  1. 检查CSRF令牌cookie名称。

请参阅CSRF_COOKIE_NAME以获取更多信息。

  1. ensure_csrf_cookie装饰器添加到视图(呈现页面的视图)中。

根据文档

警告

如果您的视图未呈现包含csrf_tokentemplate标签的模板,则Django可能未设置CSRF令牌cookie。在将表单动态添加到页面的情况下,这很常见。为了解决这种情况下,Django提供这迫使设置cookie的视图修饰:ensure_csrf_cookie()

  1. 假设CSRF令牌cookie名称为csrftoken,请尝试发送X-CSRFToken标头。
    $.ajax({
    // Your options here.
    headers: {'X-CSRFToken': getCookie('csrftoken')}
    

    });

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

2020-07-26