找不到 Django 设置模块

Posted

技术标签:

【中文标题】找不到 Django 设置模块【英文标题】:Django settings module not found 【发布时间】:2016-12-03 22:14:51 【问题描述】:

背景

我正在尝试通过关注these instructions 来按环境拆分我的设置。

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

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

目前是下面一行

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

在这些文件中可用

manage.py
wsgi.py

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

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

__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 import settings 然后settings.DOMAIN 这样访问它们。 【参考方案1】:

django.conf 导入设置后,不得再次从设置导入;你已经有了设置对象,你可以直接参考settings.DOMAIN

【讨论】:

这很有趣.. 但是为什么在我拥有from bx.settings import DOMAIN 之前它会起作用?它是否将bx.settings 视为一个模块而不是一个对象?如果是这样.. 为什么? 不,这与它无关,我不确定您对什么感到困惑。在直接从模块导入 DOMAIN 之前;但现在您尝试导入模块,然后在导入语句中再次引用该模块。 好的,我更新了我的问题(重新模板).. 我保证最后一次更新! TEMPLATES = [ 'DIRS': [os.path.join(os.path.dirname(BASE_DIR), 'templates')],...【参考方案2】:

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

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

【讨论】:

以上是关于找不到 Django 设置模块的主要内容,如果未能解决你的问题,请参考以下文章

django 频道配置不当:在 ASGI_APPLICATION 模块中找不到“应用程序”

找不到模块'corsheaders' django/heroku deploy

DJANGO REST API--找不到模块错误

django wsgi 错误找不到名为站点名称的模块

在 Elastic Beanstalk 上部署时找不到模块 Django

提示:*找不到patterns模块,怎么办?