【问题标题】:.env keyError in django projectdjango项目中的.env keyError
【发布时间】:2020-12-10 09:31:53
【问题描述】:

因为我的 django 项目,我很难过。
谁能帮忙?
非常感谢您的帮助。

在项目根路径中设置.env

SECRET_KEY=exampleKey
DEBUG=False


DB_ENGINE=django.db.backends.mysql
DB_NAME=example
DB_USER=admin

...Blah Blah

项目settings.py

import os
import environ

env = environ.Env(DEBUG=(bool, False), )
environ.Env.read_env()

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

SECRET_KEY = env('SECRET_KEY')

DEBUG = env('DEBUG')

...Blah Blah

当运行项目时 我收到一条错误消息。

Django_workspace/asone/asone/.env doesn't exist - if you're not configuring your environment separately, create one.
  "environment separately, create one." % env_file)

    raise KeyError(key) from None
KeyError: 'SECRET_KEY'

During handling of the above exception, another exception occurred:

/Django_workspace/asone/venv/lib/python3.7/site-packages/environ/environ.py", line 277, in get_value
    raise ImproperlyConfigured(error_msg)
django.core.exceptions.ImproperlyConfigured: Set the SECRET_KEY environment variable

我很难过,因为我是 django 初学者。
谁能帮忙?非常感谢您的帮助。


.PS

非常感谢您的回答。 对不起。我告诉你,我错过了一些东西。

我设置了一个django-environ 包以在项目中使用.env

pip install django-environ

我有什么遗漏吗?
解决这个问题还需要哪些信息?


.PS

设置 python-dotenv 包

pip install python-dotenv.

更改设置.py

import os
from dotenv import load_dotenv

load_dotenv()

...

SECRET_KEY = os.getenv('SECRET_KEY')
DEBUG=os.getenv('DEBUG')

DATABASES = {
    'default': {
        # 'ENGINE': env('DB_ENGINE'),
        # 'NAME': env('DB_NAME'),
        # 'USER': env('DB_USER'),
        # 'PASSWORD': env('DB_PASSWORD'),
        # 'HOST': env('DB_HOST'),
        # 'PORT': env('DB_PORT'),
        'ENGINE': os.getenv('DB_ENGINE'), 
        'NAME': os.getenv('DB_NAME'),
        'USER': os.getenv('DB_USER'),
        'PASSWORD': os.getenv('DB_PASSWORD'),
        'HOST': os.getenv('DB_HOST'),
        'PORT': os.getenv('DB_PORT'),
    }
}
...

然后我遇到了这个错误信息。

Watching for file changes with StatReloader
Exception in thread django-main-thread:
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/logging/config.py", line 562, in configure
    handler = self.configure_handler(handlers[name])
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/logging/config.py", line 735, in configure_handler
    result = factory(**kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/logging/handlers.py", line 148, in __init__
    BaseRotatingHandler.__init__(self, filename, mode, encoding, delay)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/logging/handlers.py", line 55, in __init__
    logging.FileHandler.__init__(self, filename, mode, encoding, delay)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/logging/__init__.py", line 1087, in __init__
    StreamHandler.__init__(self, self._open())
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/logging/__init__.py", line 1116, in _open
    return open(self.baseFilename, self.mode, encoding=self.encoding)
FileNotFoundError: [Errno 2] No such file or directory: '/Users/haemil/Desktop/Back-end workspace/Django_workspace/asone/logs/logfile'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 926, in _bootstrap_inner
    self.run()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "/Users/haemil/Desktop/Back-end workspace/Django_workspace/asone/venv/lib/python3.7/site-packages/django/utils/autoreload.py", line 53, in wrapper
    fn(*args, **kwargs)
  File "/Users/haemil/Desktop/Back-end workspace/Django_workspace/asone/venv/lib/python3.7/site-packages/django/core/management/commands/runserver.py", line 110, in inner_run
    autoreload.raise_last_exception()
  File "/Users/haemil/Desktop/Back-end workspace/Django_workspace/asone/venv/lib/python3.7/site-packages/django/utils/autoreload.py", line 76, in raise_last_exception
    raise _exception[1]
  File "/Users/haemil/Desktop/Back-end workspace/Django_workspace/asone/venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 357, in execute
    autoreload.check_errors(django.setup)()
  File "/Users/haemil/Desktop/Back-end workspace/Django_workspace/asone/venv/lib/python3.7/site-packages/django/utils/autoreload.py", line 53, in wrapper
    fn(*args, **kwargs)
  File "/Users/haemil/Desktop/Back-end workspace/Django_workspace/asone/venv/lib/python3.7/site-packages/django/__init__.py", line 19, in setup
    configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
  File "/Users/haemil/Desktop/Back-end workspace/Django_workspace/asone/venv/lib/python3.7/site-packages/django/utils/log.py", line 75, in configure_logging
    logging_config_func(logging_settings)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/logging/config.py", line 799, in dictConfig
    dictConfigClass(config).configure()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/logging/config.py", line 570, in configure
    '%r' % name) from e
ValueError: Unable to configure handler 'file'

我有什么遗漏吗?

【问题讨论】:

  • 为什么要设置.env路径?
  • 我把它放在根目录而不是设置它。 project/.env还有什么需要回答的吗?

标签: django environment-variables


【解决方案1】:

stdlib(python 标准库)中没有environ 模块。所以我通过运行pip install environ 来检查是否存在名为“environ”的第三方模块,它安装了它,但是当我在pypi website 进行检查时,我看不到任何有效的解释。我认为它维护得不好。

所以我得出结论,您的环境配置有点奇怪。

这是我的建议

  1. 通过运行pip install python-dotenv 安装python-dotenv 模块。 .env 模块有很多,但在我看来,这是最受欢迎、维护良好的模块之一。

  2. 确保您的.env 文件位于settings.py 所在的目录中。 setting.py 将在同一目录中加载 .env 文件,除非另有说明

  3. 从此更改您的代码

import os
import environ

env = environ.Env(DEBUG=(bool, False), )
environ.Env.read_env()

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

SECRET_KEY = env('SECRET_KEY')

DEBUG = env('DEBUG')

到这里

import os
from dotenv import load_dotenv

load_dotenv()

...

SECRET_KEY = os.getenv('SECRET_KEY')
DEBUG=os.getenv('DEBUG')

...

以类似的方式更改您的数据库设置

DATABASES = {
    'default': {
        'ENGINE': os.getenv('DB_ENGINE'), 
        'NAME': os.getenv('DB_NAME'),
        'USER': os.getenv('DB_USER'),
        # and so on ...
        }
    }
}

【讨论】:

  • 非常感谢您的回答。我会将您的答案应用到项目中
  • 首先,非常感谢您的帮助。我遵循了您的解决方案。然后我遇到了这个错误信息。 ValueError: Unable to configure handler 'file' 我有什么遗漏吗?解决此问题还需要哪些信息?
  • 您是否通过在虚拟环境中运行pip install python-dotenv 来安装python-dotenv?还是你跑了pip install python-dotenv.
  • 我欠你一个。感谢您向我解释这一点。
  • 我想我是在虚拟环境中安装的。你能继续这个问题吗? stackoverflow.com/questions/63516502/…
【解决方案2】:

您遇到了 KeyError,因为:

  1. 您没有将 SECRET_KEY 变量放入您的 .env 文件中。

  2. 它找不到您的.env 文件。

根据我从您的回答中可以看出,尝试将您的 .env 文件从您的根目录移动到它将位于 settings.py 旁边的位置。

【讨论】:

  • 非常感谢您的回答。我会将您的答案应用到项目中。
  • 并排放置,出现新错误。错误消息是ValueError: Unable to configure handler 'file' 感谢您的回答..!我真的要感谢你的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
  • 2021-05-22
  • 2013-03-28
  • 2016-01-14
  • 2019-07-10
  • 2020-05-21
  • 2021-10-01
相关资源
最近更新 更多