0

我在与我的 settings.py 文件相同的目录中创建了一个 .env 文件,其中有一些环境变量,例如:secret_key、database_name 等。但是,它似乎没有在 .env 中正确读取数据库名称文件。我觉得我遵循了文档,但在推送到 Heroku 时仍然出现配置不正确的错误。它在本地运行服务器时确实有效。

设置.py

from pathlib import Path
import os
from datetime import timedelta

import environ
env = environ.Env()
environ.Env.read_env()

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

# Take environment variables from .env file
environ.Env.read_env(os.path.join(BASE_DIR, '.env'))

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/4.0/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = env('SECRET_KEY')

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = env('DEBUG')

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': env('DATABASE_NAME'),
        'USER': env('DATABASE_USER'),
        'PASSWORD': env('DATABASE_PASSWORD'),
        'HOST': env('DATABASE_HOST'),
        'PORT': env('DATABASE_PORT'),
    }
}

.env(示例)

SECRET_KEY=django-insecure-vdihiodnsdkcndocndcndocdcoidcosjvodjv
DEBUG=True

DATABASE_NAME=vjiojjoj3oj3ioj3
DATABASE_USER=vdijvodivjdivfv
...

错误

File "/app/project_name/settings.py", line 94, in <module>
    'NAME': env('DATABASE_NAME'),
  File "/app/.heroku/python/lib/python3.10/site-packages/environ/environ.py", line 175, in __call__
    return self.get_value(
  File "/app/.heroku/python/lib/python3.10/site-packages/environ/environ.py", line 371, in get_value
    raise ImproperlyConfigured(error_msg)
django.core.exceptions.ImproperlyConfigured: Set the DATABASE_NAME environment variable

django-environ 文档:https ://github.com/joke2k/django-environ

编辑:好的,看起来使用 .env 文件推送到 Heroku 不是可行的方法。将尝试将我的 github 存储库与 heroku 链接并在设置中配置变量。我们会看看这是否会做到。

4

1 回答 1

0

您可能已经从您的编辑中猜到了,Heroku 不支持推送 .env 文件。这是因为它使用了一个临时文件系统

每个 dyno 都有自己的临时文件系统,以及最近部署的代码的新副本。[...]任何写入的文件都将在测功机停止或重新启动时被丢弃。例如,任何时候由于应用程序部署而更换测功机时都会发生这种情况,并且作为正常测功机管理的一部分,大约每天一次。

你最好使用 Heroku 的内置config var support。这里有些例子:

heroku config # View config vars
heroku config:set TEST=test # Sets TEST to "test"
heroku config:unset TEST # Reverses setting TEST
heroku config:get TEST # Returns value of TEST
于 2022-01-12T03:53:01.077 回答