Django中错误的设置模块

时间:2015-12-18 12:39:59

标签: python django django-settings

我制作了以下目录结构:

project
    main_app
        settings
            base.py
            local.py
            production.py
    ...
    manage.py

我用{<1}}开始了:

local.py

我更新from .base import * 如下(提到here):

manage.py

运行我的单元测试工作。我在本地运行服务器,这是有效的。调用API有效。然后我调用一个脚本,其中包含以下内容:

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings.local")

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

但是,当我运行此脚本时,加载对象from django.conf import settings data_dir = Path(settings.BASE_DIR) / 'csv' 时出现以下错误:

settings

当我在类django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty. 中打印设置模块时,我发现它采用了错误的设置文件(不存在):

Settings in django/conf/__init__.py

为什么没有采用正确的设置文件,如class Settings(BaseSettings): ... print('Settings module: {}'.format(settings_module)) print('DJANGO_SETTINGS_MODULE: {}'.format(os.environ['DJANGO_SETTINGS_MODULE'])) Settings module: project.settings DJANGO_SETTINGS_MODULE: project.settings 所示?我读到here它可能是中间件中的循环引用,但我无法找到它。这是我的中间件设置:

manage.py

当我在shell中回显环境变量MIDDLEWARE_CLASSES = [ 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.security.SecurityMiddleware', ] 时,我得到一个空行。要检查环境变量是否在我的项目中的某个位置设置,我会在终端中明确搜索它。

$DJANGO_SETTINGS_MODULE

2 个答案:

答案 0 :(得分:2)

  

运行我的单元测试工作。我在本地运行服务器,这是有效的。调用API有效。 然后我调用一个脚本,其中包含以下内容:

你怎么称呼你的剧本?显然不是通过manage.py

这一行:

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings.local")

需要出现在每个脚本中。

另外,请确保没有任何内容覆盖DJANGO_SETTINGS_MODULE的值,也不会手动调用settings.configure()

提示:为避免一遍又一遍地重复相同的代码,并避免此类问题,我经常使用custom management commands而不是编写自己的脚本。

答案 1 :(得分:0)

我不知道它是否有帮助,但我会说出我所知道的以及我们如何做到这一点。首先,修补manage.py是一个坏主意。我相信这个文件需要不受影响。我们有以下设置:一个settings.py包含项目的设置和变量。在它附近我们有local.py。在我们的设置中:import * from local。此文件位于本地计算机上,并具有以下内容:

#database settings for sqlite
#passwords for apis
debug=True

然后我们必须将此文件添加到.gitignore,所以在git pull from production之后我们不会在生产服务器上有这个文件。 在制作时我们创建另一个local.py

#database settings for production database
#passwords for apis
debug=False

所以本地意味着不是开发,而是&#34;本地机器&#34;