我制作了以下目录结构:
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
答案 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;