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

Django+React部署Heroku报staticfiles.W004警告及静态资源异常

问题排查与调整方案

你现在遇到的静态资源、业务数据加载异常,和「文件没放根目录」没有直接关系,核心是配置错误、结构命名不合法、部署流程缺失几个问题,逐个说明:

核心故障根因

  • 主配置文件夹命名不合法:你存放settings.py的目录名为ever-actor(带横杠),但Python模块不支持横杠命名,配置里写的ROOT_URLCONF = 'ever_actor.urls'、WSGI_APPLICATION = 'ever_actor.wsgi.application'都是按下划线匹配模块,部署后会出现路由导入异常。
  • 主机头校验配置错误:ALLOWED_HOSTS里填的是ever-actor.herokuapp,缺少.com后缀,Heroku转发的请求会被Django拦截,导致静态资源、接口响应异常。
  • 数据库连接配置错误:你手动删除了PG连接必需的sslmode参数,Heroku的PostgreSQL服务强制要求SSL连接,这个操作会导致应用连不上数据库,迁移无法正常写入表结构,业务数据自然读不出来。
  • 静态文件警告触发原因:STATICFILES_DIRS配置的/app/static目录如果是空目录,Git提交时不会被推送到Heroku,部署后路径不存在就会报staticfiles.W004警告。同时你没有配置React前端的自动构建流程,部署后不存在build目录,前端模板、静态资源都找不到。

对你的三个问题的明确答复

1. 是否必须将所有文件放置在项目根目录才能被Heroku正常读取?

不需要。
Heroku识别Python项目的核心要求是:Git仓库根目录(也就是你现在放requirements.txt、Procfile、manage.py的层级)存在Python生态的识别文件,内层的应用代码、配置文件只要路径和导入逻辑匹配,放在子目录完全可以正常运行,不需要全部移到根目录。

2. 如何调整目录结构才不会破坏现有项目逻辑?

不需要大改目录结构,只需要做几个小调整,完全不会影响现有两个urls.py的路由逻辑(根路由在配置目录下,通过include挂载api/urls.py的规则和目录位置无关):

  • 第一步:把存放settings.py的主配置文件夹从ever-actor重命名为ever_actor(横杠改下划线),和配置里写的模块导入路径完全对应。
  • 第二步:修正配置项:
    • 把ALLOWED_HOSTS里的ever-actor.herokuapp改成ever-actor.herokuapp.com,同时在CSRF_TRUSTED_ORIGINS、CORS_ORIGIN_WHITELIST里加上https://ever-actor.herokuapp.com,避免跨域、主机头校验拦截。
    • 删除配置最后一行del DATABASES['default']['OPTIONS']['sslmode'],恢复Heroku PostgreSQL必需的SSL连接配置。
    • 调整静态文件目录配置,避免路径不存在的警告:
      STATICFILES_DIRS = []
      local_static_dir = os.path.join(BASE_DIR, 'static')
      if os.path.exists(local_static_dir):
          STATICFILES_DIRS.append(local_static_dir)
      react_static_dir = os.path.join(BASE_DIR, 'build', 'static')
      if os.path.exists(react_static_dir):
          STATICFILES_DIRS.append(react_static_dir)
      
    • 如果你本地的static目录是空的,在目录里新建一个名为.gitkeep的空文件,保证Git能把这个目录推送到Heroku。
  • 第三步:补全部署流程:
    • 给Heroku添加Node.js构建包(顺序在Python构建包之前),保证部署时能运行npm命令。
    • 在package.json的scripts节点下添加构建命令:
      "heroku-postbuild": "npm install && npm run build"
      
      部署时会自动构建React前端,生成配置里引用的build目录。
    • 修改Procfile内容,添加自动迁移步骤,不用手动执行迁移命令:
      release: python manage.py migrate
      web: gunicorn ever_actor.wsgi
      

3. 本地的db.sqlite3是否需要调整存放位置?

不需要调整本地存放位置,但要做两个配置:

  • 把db.sqlite3、本地.env文件加入.gitignore列表,不要提交到Heroku:Heroku的文件系统是临时的,dyno重启后所有写入的文件都会被重置,sqlite文件存不住;同时Heroku会自动注入PostgreSQL的DATABASE_URL环境变量,提交本地sqlite和.env反而会干扰线上数据库配置。
  • 本地的sqlite连接配置只写在本地.env里即可,线上dj_database_url会自动读取Heroku注入的PG连接串,不需要手动改数据库配置做环境区分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:24:21