关于python:找不到Django设置模块

Django settings module not found

背景

我正试图按照这些说明按环境拆分设置。

现在我只想这样运行我的测试命令:

1
./run ./manage.py test --settings=bx.settings.local

当前的下一行

1
os.environ.setdefault("DJANGO_SETTINGS_MODULE","bx.settings")

在这些文件中可用

1
2
manage.py
wsgi.py

所以我删除了它(因为它应该从命令行中读取)。

我还在我的bx应用程序中创建了一个settings文件夹,并添加了这些文件。

1
2
3
__init__.py
base.py
local.py

对它。

笔记

注:run文件如下:

1
2
3
4
5
6
7
8
9
#!/usr/bin/env bash
DIR="$( cd"$( dirname"${BASH_SOURCE[0]}" )" && pwd )"
docker run \
  --env"PATH=/beneple/venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" \
  --link beneple_db:db \
  -v $DIR:/beneple \
  -t -i --rm \
  beneple/beneple \
  $@

问题

当我运行命令时

1
./run ./manage.py test --settings=bx.settings.local

我得到这个错误

1
2
3
  File"/beneple/bx/org/serializers.py", line 10, in <module>
    from bx.settings import DOMAIN
ImportError: cannot import name DOMAIN

在序列化程序中。Py:10,我们得到了这个。

1
from bx.settings import DOMAIN

所以我用

1
2
from django.conf import settings
from settings import DOMAIN

相反,我得到了这个错误:

1
2
3
  File"/beneple/bx/org/serializers.py", line 12, in <module>
    from settings import DOMAIN
ImportError: No module named settings

调试

奇怪的是,如果我在from django.conf import settings后面放置一个断点,然后键入以下内容:

1
2
3
4
ipdb> print(settings)
<Settings"bx.settings.local">
ipdb> settings.DOMAIN
'http://localhost:8000'

我很困惑为什么它不能将这里的设置识别为一个模块?

更新

我注意到我的模板目录改变了。在我的设置文件中

1
2
3
4
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
..
TEMPLATES = [{
    'DIRS': [os.path.join(BASE_DIR, 'templates')],..

然而,注意旧路和新路之间的settings.TEMPLATES[0]['DIRS']
的价值差异:

老路:

1
2
os.environ.setdefault("DJANGO_SETTINGS_MODULE","bx.settings")
['/beneple/templates']

新方法:

1
2
./run ./manage.py test --settings=bx.settings.local
['/beneple/bx/templates']

为什么会这样?我如何(以编程方式)使新方法输出与旧方法相同的结果?


django.conf导入设置后,不能再从设置中导入;您已经有了设置对象,可以直接引用settings.DOMAIN


from settings import DOMAIN尝试从PYTHONPATH加载模块settings,而不是从您已经导入的模块加载。

您可以执行以下操作:DOMAIN = settings.DOMAIN