当前位置: 首页 > 面试题库 >

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

郜修雅
2023-03-14
问题内容

我在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')

有什么帮助吗?

谢谢。


问题答案:

这是可以做的:

  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')}
    

    });

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



 类似资料:
  • 问题内容: 已编辑 我有一个ajax调用(使用),它调用以下php脚本。 这持续了40秒。 如果我关闭触发调用的浏览器窗口, 即使我显式发送了一个字符串并刷新了缓冲区 ,它仍然返回false ! 请问有人在这里回答吗? 问题答案: 您将需要添加“ ignore_user_abort(true);” 在PHP脚本之上,并在从脚本中回显某些内容后调用“ ob_flush()”(有关原因,请参见 PHP

  • 问题内容: 我正在按照以下说明使用Python绑定安装的OpenCV 2.4 。 我的问题与此类似,但我需要Windows计算机解决方案。 问题:当我尝试使用时 它工作正常,但是以下代码 始终返回False。 文件路径正确,绝对且没有空格。 我在装有Windows XP和Windows 7的两台机器上进行了尝试,结果相似。在Linux(Ubuntu)上,它对我来说很好用。 问题答案: 添加到Win

  • npm错误!有效得安装目标: npm错误![“0.1.0”,“0.1.1”,“0.1.2”,“0.1.3”,“0.1.4”] npm错误!在installTargetsError(C:\Program Files(x86)\nodejs\node_modules\ S:698:17) npm错误!在C:\Program Files(x86)\nodejs\node_module\npm\lib\c

  • 问题内容: 尝试访问$ container的’.box’类时,在ajax调用内部使用(this)不起作用。 如果不清楚我要做什么,我会尝试更改动态元素的css。但是例如 根本没有调整css。如果我将其移到ajax,success部分之外,它可以工作,但是我无法获得“描述”。 问题答案: 你近了 在您使用它的上下文中,“ this”是指ajax请求,而不是发出事件的事物。要解决此问题,请在发出aja

  • 问题内容: 我有一个JSF表单,上面有一个selectBooleanCheckbox。如果该复选框的值为true,则要在其旁边显示组合框。但是不知何故它不起作用。 这是我的代码: Bean类方法: 注意:从FireBug复制 这是POST请求: 响应: 问题答案: 实际上,实现所需功能的直接方法是根据复选框的选择重新呈现组合框。这可以通过以下方式完成: 请注意,该代码在Bean中不需要任何特殊字段

  • 我刚刚开始学习laravel,我正在使用MAMP。我在这个url上有一个表单:http://localhost:8888/laravel-site/my new app/public/ducks但当我提交表单时,它会将我带到此url:http://localhost:8888/ducks不会停留在我期望的地方。 routes.php文件包含以下内容: 在我的生活中。htaccess文件我有这个: