Python Django中的错误设置模块
我制作了以下目录结构:Python Django中的错误设置模块,python,django,django-settings,Python,Django,Django Settings,我制作了以下目录结构: project main_app settings base.py local.py production.py ... manage.py 我开始使用local.py: from .base import * 我将manage.py更新如下(已提及): 运行我的单元测试很有效。我在本地运行服务器,这很有效。调用API是有效的。然后,我调用一个脚本,其中包含
project
main_app
settings
base.py
local.py
production.py
...
manage.py
我开始使用local.py
:
from .base import *
我将manage.py
更新如下(已提及):
运行我的单元测试很有效。我在本地运行服务器,这很有效。调用API是有效的。然后,我调用一个脚本,其中包含以下内容:
from django.conf import settings
data_dir = Path(settings.BASE_DIR) / 'csv'
但是,当我运行此脚本时,在加载对象设置时会出现以下错误:
django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.
当我在django/conf/_init__.py
中的classsettings中打印设置模块时,我发现它使用了错误的设置文件(该文件不存在):
为什么不采用正确的设置文件,如manage.py
中所示?我读到它可能是中间件中的循环引用,但我找不到它。这是我的中间件设置:
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\u SETTINGS\u 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")
我不知道这是否有帮助,但我会告诉你我所知道的以及我们是如何做到的。首先,修补manage.py是个坏主意。我相信这个文件需要保持原样。我们有以下设置:one settings.py包含项目的设置和变量。在它附近我们有local.py。在设置中,我们有:import*from local
。此文件位于本地计算机上,具有以下内容:
#database settings for sqlite
#passwords for apis
debug=True
然后我们必须将此文件添加到.gitignore,这样在git从生产中拉出来之后,我们就不会在生产服务器上拥有此文件。
在生产中,我们创建另一个local.py
#database settings for production database
#passwords for apis
debug=False
因此,“本地”不是指开发,而是“本机的本地”
运行我的单元测试很有效。我在本地运行服务器,这很有效。调用API是有效的然后调用一个脚本,其中包含以下内容:
你怎么称呼你的剧本?显然不是通过manage.py
这一行:
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings.local")
需要出现在每个脚本中
此外,确保周围没有任何内容覆盖DJANGO\u SETTINGS\u MODULE
的值,也没有任何内容手动调用SETTINGS.configure()
提示:为了避免重复相同的代码,避免出现此类问题,我经常使用而不是编写自己的脚本。您能在shell中回显$DJANGO\u设置\u模块吗?如果已设置,它将覆盖manage.py
中的默认设置。您还可以粘贴更新后的manage.py
脚本的全部内容吗?我已经用这些附加信息更新了问题。我遵循《Django的两个勺子》一书中的惯例,老实说,这似乎是处理不同设置文件的更好方法。修补manage.py以满足您的需要是完全有效的。它是您项目的一部分,而不是Django安装。事实上,我没有通过manage.py
运行它。现在,在加载设置对象之前,我将该行复制到脚本中。但是,我仍然得到相同的错误。@physicalattraction:在conf/\uuuuu init\uuuuuuu.py
中,除了打印设置模块名称之外,请尝试打印DJANGO\u设置\u模块的值。另外,请确保不要调用settings.configure()
(也不要调用DJANGO\u settings\u MODULE
两次)环境变量设置为与设置模块名称相同,我已经在问题中对其进行了更新。我(认为我)没有显式调用settings.configure()
或DJANGO\u settings\u模块两次,除非DJANGO.conf import settings中的行发生这种情况,某些内容正在覆盖env变量。请尝试grep-r DJANGO\u设置\u模块
,并确保调用脚本时DJANGO\u设置\u模块
确实未设置(请记住,setdefault()
仅在未设置env变量的情况下工作)。事实上,环境变量已经设置好了!我在Eclipse中自动运行它。当我设置环境变量而不是使用setdefault
时,问题就消失了!:-)
#database settings for production database
#passwords for apis
debug=False
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings.local")