我做了如下目录结构:
project
main_app
settings
base.py
local.py
production.py
...
manage.py
我开始使用 local.py:
from .base import *
我更新 manage.py 如下(提到 here ):
#!/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)
运行我的单元测试有效。我在本地运行服务器,这很有效。调用 API 有效。然后我调用一个脚本,其中包含以下内容:
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
为什么它不采用正确的设置文件,如 manage.py 中所示?我读了here它可能是中间件中的循环引用,但我找不到它。这是我的中间件设置:
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',
]
当我在 shell 中回显环境变量 $DJANGO_SETTINGS_MODULE 时,我得到一个空行。为了检查我的项目中是否设置了环境变量,我在终端中明确搜索它。
$ pwd
/Applications/XAMPP/htdocs/project/src
$ sift DJANGO_SETTINGS_MODULE
Binary file matches: project/__pycache__/wsgi.cpython-35.pyc
main_app/wsgi.py:os.environ.setdefault("DJANGO_SETTINGS_MODULE", "main_app.settings.local")
Binary file matches: fe_import/__pycache__/CsvReader.cpython-35.pyc
fe_import/CsvReader.py: os.environ.setdefault("DJANGO_SETTINGS_MODULE", "main_app.settings.local") ==> This is the script I am running
manage.py: os.environ.setdefault("DJANGO_SETTINGS_MODULE", "main_app.settings.local")
请您参考如下方法:
Running my unit tests works. I run the server locally, which works. Making calls to the API works. I then call a script, in which I have the following:
你如何调用你的脚本?显然不是通过 manage.py。
这一行:
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings.local")
需要出现在每个脚本中。
此外,请确保周围没有任何东西覆盖 DJANGO_SETTINGS_MODULE 的值,也没有任何东西手动调用 settings.configure()。
提示:为了避免一遍又一遍地重复相同的代码,也为了避免出现此类问题,我经常使用custom management commands。而不是自己编写脚本。
