Skip to main content
 首页 » 编程设计

python之Django 中错误的设置模块

2024年10月24日35zhwl

我做了如下目录结构:

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。而不是自己编写脚本。