我正在尝试按照这些说明按环境拆分我的设置。
现在我想简单地运行我的测试命令,如下所示:
./run ./manage.py test --settings=bx.settings.local
目前以下行
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "bx.settings")
在这些文件中可用
manage.py
wsgi.py
所以我删除了它(因为它应该从命令行读取)。
我还在我的
settings
应用程序中创建了一个 bx
文件夹并添加了文件
__init__.py
base.py
local.py
对它。
注意:
run
文件是这样的:
#!/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 \
$@
当我运行命令时
./run ./manage.py test --settings=bx.settings.local
我收到此错误
File "/beneple/bx/org/serializers.py", line 10, in <module>
from bx.settings import DOMAIN
ImportError: cannot import name DOMAIN
在serializers.py:10中,我们得到了这个
from bx.settings import DOMAIN
所以我用
替换了
bx.settings
from django.conf import settings
from settings import DOMAIN
但我得到了这个错误:
File "/beneple/bx/org/serializers.py", line 12, in <module>
from settings import DOMAIN
ImportError: No module named settings
奇怪的是,如果我在
from django.conf import settings
之后放置一个断点,然后输入以下内容:
ipdb> print(settings)
<Settings "bx.settings.local">
ipdb> settings.DOMAIN
'http://localhost:8000'
我很困惑为什么它不将此处的设置识别为模块?
我注意到我的模板目录发生了变化。在我的设置文件中我有
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
..
TEMPLATES = [{
'DIRS': [os.path.join(BASE_DIR, 'templates')],..
但是请注意旧方式和新方式之间
settings.TEMPLATES[0]['DIRS']
值的差异:
老方法:
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "bx.settings")
['/beneple/templates']
新方法:
./run ./manage.py test --settings=bx.settings.local
['/beneple/bx/templates']
为什么会这样?以及如何(以编程方式)使新方式输出与旧方式相同的结果?
从
django.conf
导入设置后,不得再次从设置导入;你已经有了设置对象,直接参考settings.DOMAIN
即可。
from settings import DOMAIN
尝试从 settings
加载模块 PYTHONPATH
,而不是从您已导入的模块。
您可以执行以下操作:
DOMAIN = settings.DOMAIN
同一主题,但问题略有不同。如果您在项目中的同一个文件夹中维护设置,那么您有settings.py,现在您想要Project/local/gv并且其中有settings.py,它会给您一个错误 modulenotfounderror ,您必须删除原始的settings.py当您通过环境变量 DJANGO_SETTINGS_MODULE 设置它时,在项目文件夹中。
有人可以对此发表评论吗,解决方案是删除,但为什么?