繁体   English   中英

蟒蛇解耦 | SECRET_KEY 设置不能为空

[英]python-decouple | The SECRET_KEY setting must not be empty

该项目是使用 Django 3.1.1 创建的。 它最近更新为 Django 3.1.4 并且运行良好。 之后,安装了 python-decouple 3.3,它也运行良好。 我们(故意)删除了我们的测试数据库,以查看是否一切正常并且发生了这种情况。 运行python manage.py makemigrations时出现以下错误

Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    main()
  File "manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "P:\crm\env\lib\site-packages\django\core\management\__init__.py", line 401, in execute_from_command_line
   utility.execute()
  File "P:\crm\env\lib\site-packages\django\core\management\__init__.py", line 395, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "P:\crm\env\lib\site-packages\django\core\management\base.py", line 330, in run_from_argv 
    self.execute(*args, **cmd_options)
  File "P:\crm\env\lib\site-packages\django\core\management\base.py", line 368, in execute
    self.check()
  File "P:\crm\env\lib\site-packages\django\core\management\base.py", line 392, in check
    all_issues = checks.run_checks(
  File "P:\crm\env\lib\site-packages\django\core\checks\registry.py", line 70, in run_checks
    new_errors = check(app_configs=app_configs, databases=databases)
  File "P:\crm\env\lib\site-packages\django\core\checks\templates.py", line 22, in 
    check_setting_app_dirs_loaders
    for conf in settings.TEMPLATES
  File "P:\crm\env\lib\site-packages\django\conf\__init__.py", line 83, in __getattr__
    self._setup(name)
  File "P:\crm\env\lib\site-packages\django\conf\__init__.py", line 70, in _setup
    self._wrapped = Settings(settings_module)
  File "P:\crm\env\lib\site-packages\django\conf\__init__.py", line 177, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "C:\Users\rodri\AppData\Local\Programs\Python\Python38\lib\importlib\__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "P:\crm\app\config\settings.py", line 13, in <module>
     from core.user.models import User as u
  File "P:\crm\app\core\user\models.py", line 1, in <module>
    from django.contrib.auth.base_user import AbstractBaseUser
  File "P:\crm\env\lib\site-packages\django\contrib\auth\base_user.py", line 48, in <module>
    class AbstractBaseUser(models.Model):
  File "P:\crm\env\lib\site-packages\django\db\models\base.py", line 108, in __new__
    app_config = apps.get_containing_app_config(module)
  File "P:\crm\env\lib\site-packages\django\apps\registry.py", line 253, in get_containing_app_config
    self.check_apps_ready()
  File "P:\crm\env\lib\site-packages\django\apps\registry.py", line 135, in check_apps_ready
    settings.INSTALLED_APPS
  File "P:\crm\env\lib\site-packages\django\conf\__init__.py", line 83, in __getattr__
    self._setup(name)
  File "P:\crm\env\lib\site-packages\django\conf\__init__.py", line 70, in _setup
    self._wrapped = Settings(settings_module)
  File "P:\crm\env\lib\site-packages\django\conf\__init__.py", line 196, in __init__
    raise ImproperlyConfigured("The SECRET_KEY setting must not be empty.")
django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.

我的项目结构如下:

project
|
|- config
|    |- .env
|    |- settings.py
|- core
     |- app1
     |- app2

这是我的settings.py

import config.db as db
from core.user.models import User # Custom user model
from decouple import config
from pathlib import Path

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent

SECRET_KEY = config('SECRET_KEY')
DEBUG = config('DEBUG', cast=bool)
...

这是.env文件结构

SECRET_KEY=abcdefghikjlmnopqrstuvwxyz
DEBUG=True
...

我尝试了许多这里建议的替代方案,但没有一个有效。

问题是您无法在设置设置之前导入模型。 因此,当您在设置文件的顶部导入模型时,您会收到错误,因为设置 object 尚未初始化,因此没有设置 SECRET_KEY 字段。

理想情况下,您根本不需要在设置中导入模型。 但是如果你必须把它们放在那里,你可以简单地将它们移到 SECRET_KEY 之后,但是......它可能仍然会导致问题。 我会尝试重构,以便您在设置文件中不需要它们。

从 python-decouple文档

只需在存储库的根目录中创建一个 .env 文本文件,格式为

因此,您需要将.env文件放在项目文件夹中(与manage.py相同的文件夹。

(@saquintes 关于在settings.py中导入模型的说法也是正确的。我怀疑您对AUTH_USER_MODEL设置很重要。对于此设置,您应该使用字符串,而不是实际的 model。请参见此处。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM