Django集成CircleCI 2.0遇ImportError:'app.settings'非包问题求助
解决Django集成CircleCI 2.0时的ImportError问题
你执行python manage.py makemigrations --settings app.settings.ci时触发了如下错误:
ImportError: No module named 'analytics_api.settings.ci'; 'analytics_api.settings' is not a package
完整回溯信息:
Traceback (most recent call last): File "manage.py", line 15, in <module> execute_from_command_line(sys.argv) File "/Users/xxx/anaconda/envs/rf/lib/python3.5/site-packages/django/core/management/__init__.py", line 371, in execute_from_command_line utility.execute() File "/Users/xxx/anaconda/envs/rf/lib/python3.5/site-packages/django/core/management/__init__.py", line 317, in execute settings.INSTALLED_APPS File "/Users/xxx/anaconda/envs/rf/lib/python3.5/site-packages/django/conf/__init__.py", line 56, in __getattr__ self._setup(name) File "/Users/xxx/anaconda/envs/rf/lib/python3.5/site-packages/django/conf/__init__.py", line 43, in _setup self._wrapped = Settings(settings_module) File "/Users/xxx/anaconda/envs/rf/lib/python3.5/site-packages/django/conf/__init__.py", line 106, in __init__ mod = importlib.import_module(self.SETTINGS_MODULE) File "/Users/xxx/anaconda/envs/rf/lib/python3.5/importlib/__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 986, in _gcd_import File "<frozen importlib._bootstrap>", line 969, in _find_and_load File "<frozen importlib._bootstrap>", line 953, in _find_and_load_unlocked ImportError: No module named 'analytics_api.settings.ci'; 'analytics_api.settings' is not a package
这个错误的核心原因很明确:你的analytics_api.settings(也就是你说的app.settings)不是一个Python包,Django没法从中导入ci模块。下面是具体的修复步骤:
1. 重构settings为Python包
你需要把原来单个的settings.py文件改成一个包含多个配置文件的文件夹(包)。正确的项目结构应该是这样的:
your_project_root/ ├── analytics_api/ # 你的app根目录(对应你说的app) │ ├── settings/ │ │ ├── __init__.py # 必须存在,空文件即可,标记这是Python包 │ │ ├── base.py # 存放通用配置(原来settings.py的内容) │ │ └── ci.py # CircleCI专属配置,继承base.py │ ├── __init__.py │ ├── urls.py │ └── wsgi.py └── manage.py
2. 迁移配置内容
- 把原来
settings.py里的所有内容复制到settings/base.py中 - 创建
settings/ci.py,写入CircleCI环境的专属配置,建议继承base的配置来避免重复代码:
from .base import * # 覆盖CI环境需要的配置项 DEBUG = False ALLOWED_HOSTS = ['*'] # CI环境的数据库配置(比如CircleCI自带的PostgreSQL) DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'circle_test', 'USER': 'postgres', 'PASSWORD': '', 'HOST': '127.0.0.1', 'PORT': '5432', } }
3. 调整manage.py的默认配置(可选)
如果不想本地开发每次都指定--settings参数,可以修改manage.py里的默认配置:
找到这一行:
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'analytics_api.settings')
改成:
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'analytics_api.settings.base')
这样本地默认使用base配置,CI环境执行命令时依旧指定analytics_api.settings.ci即可。
4. 本地验证修复
先在本地运行命令测试是否正常:
python manage.py makemigrations --settings analytics_api.settings.ci
如果本地能成功执行,再推送到CircleCI上测试即可。
另外,你提供的INSTALLED_APPS配置是正常的,和这个错误没有关系,不需要修改。
内容的提问来源于stack exchange,提问作者user9287271
相关产品推荐
相关产品推荐

