Django,CORS“访问控制允许来源”错误

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

无法弄清楚我的 Django DRF api 端点出了什么问题。我收到 CORS 错误

跨源请求被阻止:同源策略不允许读取 远程资源位于http://127.0.0.1:8000/api/。 (原因:CORS 标头“Access-Control-Allow-Origin”缺失)。状态代码:200。

问题是,我按照网上的每一步来解决这个问题。

  • 我已经安装了“django-cors-headers”
  • corsheaders 应用程序添加到上面的 INSTALLED_APPS rest_framework 以及包含 api 端点的应用程序。
  • 将 cors 中间件添加到中间件列表的顶部 设置.py
  • 添加了 'CORS_ALLOWED_ORIGINS = ('http://localhost:3000' # React 应用程序)(也尝试使用 CORS_ORIGIN_ALLOW = True)
  • 四重检查 API POST 请求是否包含尾部斜杠。

似乎没有什么可以解决这个问题。我是不是忘记了什么?感谢您的帮助。

这是我的设置.py:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'corsheaders',
    'rest_framework',
    'core.apps.CoreConfig',

]

CORS_ALLOWED_ORIGINS = (
    'http://localhost:3000',  # for localhost (REACT Default)
)


MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'corsheaders.middleware.CorsMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.common.CommonMiddleware',
]

不确定它有多相关,但如果我从失眠发送 POST 请求,它工作正常,但从 React 发送,则不行,这是我的反应请求,以防万一:

const postSomeData = async () => {
    const res = await axios.post(
      "http://127.0.0.1:8000/api/",
      { promptQuery: "pls just work already" },
      {
        headers: {
          "Content-Type": "application/json",
        },
      }
    );
  };

谢谢!

django django-rest-framework request cors
2个回答
-1
投票

代码看起来不错,似乎是中间件顺序问题。您会尝试将 corsheader 放在 sessionmiddleware 和 commonmiddleware 之间吗? 像这样的东西:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware', #here
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

因为中间件的顺序很重要。


-1
投票

请问您是如何解决这个问题的?

© www.soinside.com 2019 - 2024. All rights reserved.