在 Django POST 中未设置 CSRF cookie

问题描述 投票:0回答:1

我搜索了许多有关该主题的问题和答案,但无法解决我的问题。我的js基于这个答案

xxx.js

import Cookies from 'js-cookie';

async function sendDataToAPI(uri, params) {
    let url = buildURI(uri, params);
    let endpoint = `${process.env.API_DOMAIN}${url}/`;
    try {
        const response = await fetch(endpoint, {
            method: "POST",
            credentials: 'include',
            headers: {'X-CSRFToken': Cookies.get('csrftoken')},
            body: JSON.stringify({
                data: params,
            }),
        }
            );
        const data = await response.json();
        return data;
    ...

设置.py

...

CSRF_TRUSTED_ORIGINS = [
    'http://localhost:8888'
]

CORS_ORIGIN_ALLOW_ALL = False
CORS_ORIGIN_WHITELIST = (
    'http://localhost:8888',
)
CORS_ALLOW_HEADERS = [
        "X-CSRFToken",
]
CORS_ALLOW_CREDENTIALS = True
...
INSTALLED_APPS = [
...,
    'corsheaders',
...

]

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    ...
]

我收到错误

警告:django.security.csrf:禁止(未设置 CSRF cookie。)

django csrf
1个回答
0
投票

发生此错误并且启用

DEBUG
时,您应该在浏览器上看到此消息:

  • 您的浏览器正在接受cookie。
  • 视图函数将请求传递给模板的渲染方法。
  • 在模板中,每个针对内部 URL 的 POST 表单内都有一个 {% csrf_token %} 模板标记。
  • 如果您不使用 CsrfViewMiddleware,则必须在使用 csrf_token 模板标记的任何视图以及接受 POST 数据的视图上使用 csrf_protect。
  • 该表单具有有效的 CSRF 令牌。登录另一个浏览器选项卡或登录后点击后退按钮后,您可能需要使用表单重新加载页面,因为登录后令牌会轮换。

就我而言,所有这些要求都是正确的 - 除了我有

CSRF_COOKIE_SECURE = True
并且我通过
http://
(而不是通过
https://
)访问 Django 网站。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.