Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 1.9 AJAX表单CSRF令牌403错误-“;未设置CSRF cookie“;_Ajax_Django_Cookies_Csrf_Fetch Api - Fatal编程技术网

Django 1.9 AJAX表单CSRF令牌403错误-“;未设置CSRF cookie“;

Django 1.9 AJAX表单CSRF令牌403错误-“;未设置CSRF cookie“;,ajax,django,cookies,csrf,fetch-api,Ajax,Django,Cookies,Csrf,Fetch Api,关于这件事我已经看过很多了,但是没有什么能解决我的问题 问题: 启用CSRF中间件后,Django在AJAX表单请求上以403响应,声明: “未设置CSRF cookie。” 之后,实现了一个JS功能,它设置自定义的“X-CSRFToken”头 它按预期工作,从浏览器中获取“csrftoken”cookie,并将其与AJAX请求一起发布: x-csrftoken: 1a0u7GCQG0wepZHQNThIXeYpMy2lZOf2 但反应仍然是403 尝试过的解决方案: 我已经尝试了在SO或we

关于这件事我已经看过很多了,但是没有什么能解决我的问题

问题:

启用CSRF中间件后,Django在AJAX表单请求上以403响应,声明:

“未设置CSRF cookie。”

之后,实现了一个JS功能,它设置自定义的“X-CSRFToken”

它按预期工作,从浏览器中获取“csrftoken”cookie,并将其与AJAX请求一起发布:

x-csrftoken: 1a0u7GCQG0wepZHQNThIXeYpMy2lZOf2
但反应仍然是403

尝试过的解决方案:

我已经尝试了在SO或web上可以找到的一切,特别是:

  • 检查是否启用了中间件:

    MIDDLEWARE_CLASSES = [
        ...
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        ...
    ]
    
  • 启用cookie的不同浏览器

  • @sure_csrf_cookie
    装饰我的视图

  • 在我的模板中设置
    {%csrf_token%}

  • 使用
    render
    快捷方式获取正确的请求上下文

  • 在my
    settings.py中设置自定义
    CSRF\u COOKIE\u NAME
    CSRF\u HEADER\u NAME

  • 显式设置
    CSRF\u COOKIE\u SECURE=False
    CSRF\u COOKIE\u HTTPONLY=False

  • 显式设置
    CSRF\u可信\u来源
    设置

  • 开发和生产服务器测试

  • 正如有人建议的那样,在我看来,甚至
    request.META[“CSRF\u COOKIE\u USED”]=True

但还是一无所获

标题:

如果我在我看来使用
@csrf\u export
print(request.META)
,很明显,定制头“X-CSRFToken”存在于请求中,并根据Django文档格式化,前缀为“HTTP\uu”,连字符替换为下划线,全部大写:“HTTP\u X\u CSRFToken”

更重要的是,它的值与Django设置的cookie相匹配

Cookies:

奇怪的是,如果我尝试在视图中打印(request.COOKIES)
,在页面和表单加载中,我可以看到“csrftoken”cookie,但在AJAX请求中,字典是空的。这可能是问题所在吗


不顾一切地寻找到底是什么错了。谢谢您阅读此文。

好的,问题很简单:

默认情况下,获取API不发送凭据。根据:

请求接口的凭据只读属性指示 用户代理是否应从中的其他域发送cookie 跨来源请求的情况。这与XHR类似 withCredentials标志,但有三个可用值

默认值为
省略,它从不发送cookie。您只需将
同源
添加到
fetch()
函数参数:

fetch(formUrl, {
    ...
    credentials: 'same-origin',
    ...
})

您可以开始了:)

您可以显示您的实际视图和javascript吗?您使用什么发送AJAX请求?jQuery?@Smile0ff:Fetch API.Lol,阅读您的调试过程有点不可思议,因为我按照基本相同的顺序执行了完全相同的步骤:)