部署Django至Heroku执行collectstatic时遇ModuleNotFoundError求助
Django部署Heroku时collectstatic报错:ModuleNotFoundError
问题详情
将Django应用部署到Heroku时,执行python manage.py collectstatic --noinput出现以下错误:
ModuleNotFoundError: No module named 'my_app.settings.local'; 'quiz_api.settings' is not a package !Error while running '$ python manage.py collectstatic --noinput'.
该问题出现在将settings.py拆分为base.py、local.py和production.py之后,本地环境运行正常,但Heroku部署失败。
项目目录结构:
root my_project -my_app -settings __init___.py # 注意:此处文件名多了一个下划线,是核心错误点 base.py local.py production.py __init__.py wsgi.py etc... .env manage.py etc...
修复步骤
1. 修正settings目录的初始化文件名
settings文件夹内的初始化文件写成了__init___.py(三个下划线),Python无法识别该文件为合法的模块初始化文件,需改为**__init__.py(两个下划线)**,确保my_app.settings被识别为合法包。
2. 统一环境变量配置
- 本地开发:保持
manage.py中DJANGO_SETTINGS_MODULE为my_app.settings.local,确保本地正常运行。 - Heroku生产环境:在Heroku配置变量中设置
DJANGO_SETTINGS_MODULE为my_app.settings.production,同时确保production.py正确导入基础配置:# production.py示例代码 from .base import * # 生产环境专属配置 DEBUG = False # 其他生产环境设置(如ALLOWED_HOSTS等)
3. 调整WSGI配置
修改wsgi.py,让其优先读取环境变量,避免硬编码:
import os from django.core.wsgi import get_wsgi_application # 优先读取环境变量,本地默认用local,Heroku用production settings_module = os.environ.get('DJANGO_SETTINGS_MODULE', 'my_app.settings.local') os.environ['DJANGO_SETTINGS_MODULE'] = settings_module application = get_wsgi_application()
4. 验证BASE_DIR计算
base.py中的BASE_DIR计算可以优化为更清晰的Path写法,避免多层os.path.dirname的混淆:
from pathlib import Path BASE_DIR = Path(__file__).resolve().parent.parent.parent
该写法与原代码效果一致,均指向包含manage.py的根目录。
5. 检查Procfile与依赖
确保Procfile配置正确,指向正确的WSGI应用:
web: gunicorn my_app.wsgi:application
同时确认requirements.txt包含生产环境依赖,如gunicorn、dj-database-url、whitenoise等。
6. 本地模拟生产环境测试
在本地设置生产环境变量后执行collectstatic,验证配置是否正常:
export DJANGO_SETTINGS_MODULE=my_app.settings.production python manage.py collectstatic --noinput
若本地执行成功,再重新部署到Heroku。
内容的提问来源于stack exchange,提问作者Tw1682
相关产品推荐
相关产品推荐

