.env 文件中的环境变量在 django、heroku 的本地迁移期间不可用

Posted

技术标签:

【中文标题】.env 文件中的环境变量在 django、heroku 的本地迁移期间不可用【英文标题】:Environmental variables from .env file not available during local migrations in django, heroku 【发布时间】:2016-11-21 02:06:15 【问题描述】:

我一直在 Heroku 上进行开发,使用 config 变量来存储敏感变量和其他环境变量。在本地开发时,我已将这些变量镜像到 .env 文件中。

我现在发现的是 .env 文件中的变量在迁移期间不会加载。它们在使用 heroku local 运行本地 Web 服务器时正在加载,但不会为迁移加载。当我的本地应用程序仍在使用默认的 sqlite3 数据库时,这不是问题,因为 sqlite 默认数据库在设置文件中是“硬编码”的。但是最近我想将本地 Postgresql DB 用于本地开发。好的,所以我将DATABASE_URL 变量添加到我的.env 文件中。

我无法让我的本地应用迁移到数据库。我发现这是因为.env 文件内容在迁移过程中没有添加到os.environ 映射中。

为了测试,我在.env 文件中添加了一个测试变量:

TEST="teeeest"

然后在settings.py:

import os
import dj_database_url

if "TEST" not in os.environ:
    raise Exception("No .env vars found.")

我试过python manage.py migrate

文件“/Users/apple/heroku/b/b/settings.py”,第 16 行,在 raise Exception("No .env vars found.") Exception: No .env vars found.

但是我可以运行heroku local 并且没有错误。我还做了进一步的测试,以确保.env 变量在heroku local 期间可用。

出于各种原因,我想在.env 文件中设置我的本地数据库连接字符串,但目前似乎不可能。这是 django 在 heroku 上的正确行为吗? .env 文件变量只能在你运行服务器时访问,不能用于迁移?

【问题讨论】:

【参考方案1】:

我终于发现仅仅运行python manage.py migrate 并没有加载.env 文件变量。您需要在heroku local 环境中运行命令:

heroku local:run python manage.py migrate

https://devcenter.heroku.com/articles/heroku-local#run-your-app-locally-using-the-heroku-local-command-line-tool-run-a-one-off-command-locally

【讨论】:

以及如何为 windows 加载 .env 文件?运行 manage.py makemigrations 命令时?【参考方案2】:

manage.py 对您的 .env 文件一无所知。您需要在可以执行的操作下运行该命令; Foreman,这是 Heroku 本身使用的,或者 Honcho,这是一个 Python 实现。

【讨论】:

我实际上是在一个长周末后才想出来的-> heroku local:run python manage.py migrate。 devcenter.heroku.com/articles/…

以上是关于.env 文件中的环境变量在 django、heroku 的本地迁移期间不可用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 .env 文件中的环境变量来填写同一个 .env 文件中的其他环境变量

Heroku.yml 文件。如何从 .env 文件传递​​环境变量?

使用 Python 和 dotenv 更改保存在 .env 文件中的环境变量

关于Lumen / Laravel .env 文件中的环境变量是如何生效的

.env 文件中的变量的 nestjs 问题

我是不是错误地从 CLion 中的文件中获取环境变量,或者 env 文件语法不正确?