如何解决我的Django API的CORS问题?

时间:2018-11-02 19:25:29

标签: python django docker cors

我无法在Django API中解决CORS问题。调用此API时,出现错误:

  

可以从原始位置获取“ http://localhost:8000/”上的内容   “ http://localhost”已被CORS政策屏蔽:对   预检请求未通过访问控制检查:否   请求中存在“ Access-Control-Allow-Origin”标头   资源。如果不透明的响应满足您的需求,请设置请求的   模式设置为“ no-cors”,以在禁用CORS的情况下获取资源。

要启用CORS,我做了pip install django-cors-headers并将以下代码添加到settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'corsheaders',
]

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

CORS_ORIGIN_WHITELIST = [
    'localhost:80',
    'localhost:8000',
    '127.0.0.1:8000'
]

我应该说我在Docker上运行我的项目。这是docker-compose.yml

version: '2'

services:
  django-docker:
    build:
      context: .
      dockerfile: Dockerfile.django
    container_name: my.django
    image: my-django
    ports:
      - 8000:8000

  webapp-docker:
    build:
      context: .
      dockerfile: Dockerfile.webapp
    container_name: my.webapp
    image: my-web
    ports:
      - 80:80

3 个答案:

答案 0 :(得分:3)

您需要将corsheaders.middleware.CorsMiddleware中间件添加到settings.py中的中间件类中:

MIDDLEWARE_CLASSES = (
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.BrokenLinkEmailsMiddleware',
    'django.middleware.common.CommonMiddleware',
    #...
)

您的中间件类中有重复的django.middleware.common.CommonMiddleware

然后,您可以通过添加以下设置为所有域启用CORS:

CORS_ORIGIN_ALLOW_ALL = True

或仅对指定域启用CORS:

CORS_ORIGIN_ALLOW_ALL = False

CORS_ORIGIN_WHITELIST = (
    'http//:localhost:8000',
)

答案 1 :(得分:2)

尝试在您的设置中添加它:

from corsheaders.defaults import default_headers

CORS_ALLOW_HEADERS = default_headers + (
    'Access-Control-Allow-Origin',
)

答案 2 :(得分:0)

我在浏览器中访问http://127.0.0.1:8000但在JavaScript代码中使用fetch('http://localhost:8000');时遇到此错误。解决方案是使用127.0.0.1localhost而不混合使用。