CORS 缺少允许来源

CORS Missing Allow Origin

我的服务器(用 Django 编写)是 运行 在 http://localhost:8000

Nuxt 申请 运行 http://localhost:3000

当我向服务器发送请求(如 http://localhost:8000/api/v1/user/position/)时,我在 firefox 浏览器中收到以下错误。

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:8000/api/v1/user/position/. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

Firefox:

Chrome:

看到了this link and this但是不知道问题出在哪里?

下面是我的 nuxt.config.js 文件的一部分。

modules: [
    '@nuxtjs/axios',
    '@nuxtjs/proxy'
],
axios: {
    baseURL: 'http://localhost:8000/api/v1/', 
},

以及我正在发送请求的函数:

async getAllPosition() {
    this.loading_position = true;
    await this.$axios.get('user/position/').then(response => {
          this.position = response.data;
    }).finally(() => {
         this.loading_position = false;
        })
 }

我认为是关于代理的,但我不知道如何配置它。

如错误消息所示:您需要在服务器中指定 Access-Control-Allow-Origin-header 以允许跨源请求。 (是的 ::3000 和 ::8000 是不同的来源)。现代浏览器将在请求另一个来源时触发一个选项 (pre-flight) 请求来检查 Access-* headers。您必须至少用 Access-Control header 回答这些 OPTIONS 请求。 Access-Control-Allow-Origin: localhost:3000 应该适合开发。

更多关于 CORS 和浏览器 OPTIONS 请求的信息:
https://enable-cors.org/
Why is an OPTIONS request sent and can I disable it?

可以设置正向代理来处理跨域

nuxt.config.js:


export default {
  ...
  proxy: {
    '/api': { 
      target: 'http://localhost:8000',
      pathRewrite: {
        '^/api': '/api',
        changeOrigin: true
      }    
    }
  },
}

正如@TMFLGR 提到的: 将 OPTION-Request 处理程序添加到您的服务器并指定 Access-Control-Allow-Origin Header。代理适用于开发,但在生产中你不应该这样做。

正如@BananaLama and @TMFLGR在他们的回答中提到的那样:

我需要在我的 Django 服务器中指定 Access-Control-Allow-Origin header 以允许跨源请求。为此,我使用了 django-cors-headers package.

pip install django-cors-headers

然后在settings.py部分允许,结果很好返回。

// settings.py

INSTALLED_APPS = [
    ...
    'corsheaders',
]

MIDDLEWARE = [
    ...
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    ...
]

CORS_ALLOWED_ORIGINS  = [
    "http://localhost:3000",
]

结果: