You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为Django项目添加Dockerfile后出现CORS错误,求解决方案

容器化后Django应用出现CORS问题分析

我有一个部署在Railway上的全栈应用,原本运行正常。为了在生产环境集成Celery运行后台任务,给Django应用添加了Dockerfile做容器化,但之后出现了CORS问题,作为Docker新手没找到解决办法,求分析。

我的Dockerfile内容

FROM python:3.9.7

WORKDIR /app

COPY . /app

RUN pip install -r requirements.txt

ENV DJANGO_SETTINGS_MODULE=backend.settings
ENV CELERY_BROKER_URL=redis://default:***********************-43.railway.app:****

ARG RAILWAY_ENVIRONMENT

ENV PORT = 8080

EXPOSE 8080

CMD ["python", "-m", "celery", "-A", "backend", "worker", "--loglevel=info","--pool=solo"]

客户端CORS报错

客户端报错显示跨域请求被阻止,原因是请求的资源上不存在Access-Control-Allow-Origin响应头。

Django的CORS配置

CORS_ALLOW_ALL_ORIGINS = False

CORS_ALLOWED_ORIGINS = [
    'http://localhost:3000',
    'https://checkout.stripe.com',
    
    'https://sendit-frontend-production.up.railway.app'
]

CORS_ALLOW_CREDENTIALS = True

MIDDLEWARE = [
    "corsheaders.middleware.CorsMiddleware",
    'django.middleware.security.SecurityMiddleware',

    'whitenoise.middleware.WhiteNoiseMiddleware',
    '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',

]

问题根源分析

  1. Dockerfile启动命令错误:当前Dockerfile的CMD只启动了Celery Worker,没有启动Django的Web服务器。这意味着容器里只有后台任务进程在运行,没有处理HTTP请求的服务,自然不会返回任何CORS相关响应头,导致前端请求失败。
  2. 环境变量格式错误:ENV PORT = 8080的写法不符合规范,等号两侧不能有空格,正确写法应为ENV PORT=8080,否则变量值会包含空格,可能导致后续服务启动时端口识别异常。

解决方案

  • 修改Dockerfile启动逻辑:需要同时启动Django Web服务和Celery Worker,推荐两种实现方式:
    1. 使用Shell脚本启动:创建start.sh脚本,内容如下:
      #!/bin/bash
      # 生产环境推荐用gunicorn启动Django,替代runserver
      gunicorn backend.wsgi:application --bind 0.0.0.0:$PORT &
      # 启动Celery Worker
      python -m celery -A backend worker --loglevel=info --pool=solo
      
      然后在Dockerfile中添加:
      RUN chmod +x start.sh
      CMD ["./start.sh"]
      
    2. 使用supervisord管理多进程:安装supervisor并配置,同时启动Django服务和Celery Worker。
  • 修正PORT环境变量:将ENV PORT = 8080改为ENV PORT=8080。
  • 验证CORS白名单:确认前端请求的Origin域名已加入CORS_ALLOWED_ORIGINS,如果后端使用Railway分配的域名,需要将该域名也添加到列表中。

内容的提问来源于stack exchange,提问作者beni14

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 02:33:37