找不到Django设置模块

时间:2016-07-29 09:00:30

标签: python django python-2.7 unit-testing django-settings

背景

我正在尝试按照these instructions按环境拆分我的设置。

现在我想简单地运行我的测试命令:

var spawn = require("child_process").spawn;
var typings = spawn("./node_modules/.bin/typings", ["install"], { shell: true });

目前有以下一行

./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

在serializers.py:10中,我们得到了这个

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

所以我用

替换了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']

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

2 个答案:

答案 0 :(得分:2)

django.conf导入设置后,您无法再次从设置导入;你已经有了设置对象,你可以直接引用settings.DOMAIN

答案 1 :(得分:1)

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

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