将Django部署到Heroku时:ModuleNotFoundError:没有名为“ dotenv”的模块

问题描述

将Django部署到Heroku时,出现marshmallow错误。但是,我的确在我的requirements.txt中列出了python-dotenv。所以我对Heroku为什么对dotenv不满意感到困惑。

这是我的要求。txt:

ModuleNotFoundError: No module named 'dotenv'

解决方法

我不知道这是否有帮助,但是在部署到Heroku时出现了该错误,但是在我的情况下,我使用的是pipenv,问题是我在pip install中安装了它的要求或所做的任何导入而不是pipenv install,一旦我在那里完成所有安装,我就不记得是否做了诸如pipenv Frozen> requirements.txt

之类的事情。 ,

而不是使用python-dotenv,请尝试使用django-dotenv

不知道您在settings.py中有什么导入,但是请尝试以下操作:

# settings.py
import os
SECRET_KEY = os.getenv('SECRET_KEY')

如果您尝试在设置文件的顶部导入dotenv,则可能需要将其删除。

还请记住在Heroku应用程序设置下的“ Config Vars”中添加这些环境变量。在您推送到Heroku之前,这些应该已经存在。

,

尝试卸载软件包并重新下载并检查它是否在 requirements.txt 文件中。

,

dotenv 的目的是“从 .env 文件中读取键值对并将它们设置为环境变量”

通常,拥有 .env 文件的目的是方便地在本地管理您的环境。

这通常不会被签入版本控制(即它列在 .gitignore 中)。好处是:

  • 其他人无法看到您的敏感环境变量
  • 在生产环境中,您可能希望无需重新部署即可更改这些变量
  • 不同的人可以在不同的环境中运行应用

因此,当您部署到 Heroku 时,通常不会包含您的 .env,因此 dotenv 与此无关。

取而代之的是 Heroku 有它的 own way of managing environment variables

这留下了在您的代码中尝试调用 dotenv 在 Heroku 上会出现您描述的错误的问题。

一种选择是仅在环境不是生产环境时才加载它。像这样:

import os

if not os.environ.get("PRODUCTION"):
    from dotenv import load_dotenv

    load_dotenv()

请注意,您需要在 Heroku 上设置 PRODUCTION 环境变量,或者选择一个已经存在的变量。