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

Docker镜像中访问Django静态资源出现404错误求助

解决Django Admin静态资源404问题

问题核心

Gunicorn是WSGI应用服务器,仅处理Django的动态请求,不会自动提供静态文件服务。虽然collectstatic已将静态资源收集到STATIC_ROOT目录,但Gunicorn无法响应这些静态资源的请求,导致页面样式丢失、控制台报404错误。

可行解决方案

方案1:用Whitenoise托管静态文件(轻量生产方案)

Whitenoise可让Django直接通过WSGI服务器提供静态文件,无需额外反向代理:

  1. 安装依赖:在requirements.txt中添加whitenoise,重新构建镜像。
  2. 修改Django的settings.py:
    • 在INSTALLED_APPS里,把'whitenoise.runserver_nostatic'放在'django.contrib.staticfiles'之前
    • 保留'django.contrib.staticfiles'
    • 在MIDDLEWARE中添加'whitenoise.middleware.WhiteNoiseMiddleware'(放在django.middleware.security.SecurityMiddleware之后)
    • 添加静态文件存储配置:
      STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
      
  3. 重新构建镜像并启动容器,静态资源即可正常加载。

方案2:Nginx反向代理处理静态文件(适合复杂场景)

如果需要更灵活的缓存、负载均衡配置,可搭配Nginx:

  1. 编写docker-compose.yml配置双服务:
    version: '3.8'
    services:
      web:
        build: .
        volumes:
          - static_volume:/home/appuser/app/static
      nginx:
        image: nginx:alpine
        volumes:
          - static_volume:/home/appuser/app/static
          - ./nginx.conf:/etc/nginx/conf.d/default.conf
        ports:
          - "8000:80"
    volumes:
      static_volume:
    
  2. 创建nginx.conf配置文件:
    server {
        listen 80;
        location /static/ {
            alias /home/appuser/app/static/;
        }
        location / {
            proxy_pass http://web:8000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
    
  3. 确认STATIC_ROOT配置(当前BASE_DIR / 'static/'已对应/home/appuser/app/static/,无需修改)。
  4. 执行docker-compose up --build启动服务,访问http://127.0.0.1:8000/admin即可看到正常样式。

注意事项

  • 确保entrypoint.sh中的collectstatic --no-input命令执行成功,容器内STATIC_ROOT目录确实存在静态文件。
  • 生产环境禁止使用Django自带的runserver提供静态文件,仅用于开发调试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:27:20