Django:无法从设置导入自定义变量

Bor*_*kov 1 django

mongo_db在 settings.py 中定义了一个自定义变量:

# connect to test database for tests and real database otherwise
if is_test():
    mongo_db = mongoengine.connect(db='test-workflows', host='workflows-mongo')
else:
    mongo_db = mongoengine.connect(db='workflows', host='workflows-mongo')
Run Code Online (Sandbox Code Playgroud)

现在,我试图从tests.py(或从python manage.py shell)导入它,但都没有成功:

from django.conf import settings
settings.mongo_db
AttributeError: 'Settings' object has no attribute 'mongo_db'
Run Code Online (Sandbox Code Playgroud)

怎么了?

更新: IIRC,Djangodjango.conf.settings通过django.conf.global_settings使用在settings.py.

因此,可能有问题的from django.conf import settings; settings.mongo_db是 Django 可能不会更新django.conf.settingsmongo_db,因为它不在默认选项中。

此外,Django 文档说django.conf.settings是一个object,而不是一个module,所以你不能说from django.conf.settings import VARIABLE. 幸运的是,我不会那样做。

Ano*_*oop 6

导入失败,因为您没有遵循 Django指南

用于创建您自己的设置。

  1. 设置名称必须全部大写。
  2. 不要重新发明一个已经存在的设置。

请注意,您的代码不应从 global_settings 或您自己的设置文件中导入。

django.conf.settings 抽象了默认设置和站点特定设置的概念;它提供了一个单一的界面。

像这样更改 settings.py 中的代码。(替换mongo_dbMONGO_DB

if is_test():
    MONGO_DB = mongoengine.connect(db='test-workflows', host='workflows-mongo')
else:
    MONGO_DB = mongoengine.connect(db='workflows', host='workflows-mongo')
Run Code Online (Sandbox Code Playgroud)

现在您可以从 django shell 和所有其他地方导入。


Say*_*yse 5

您正在尝试从 django 的设置而不是您自己的 settings.py 导入

from django.conf import settings
Run Code Online (Sandbox Code Playgroud)

应该

from your_app import settings
Run Code Online (Sandbox Code Playgroud)

  • 此外,从我所见,您在设置中进行了真正的连接,也许这不适合设置。设置应该存储静态信息而不是启动真正的数据库连接。你可以存储一个像 `{db: 'test-workflows', 'host': 'workflows-mongo'}` 这样的字典,然后在你的 `test.py` 中执行 `connect()`。 (2认同)