如何在从 manage.py 中定义的环境变量导入设置的项目上 运行 django-pytest

How to run django-pytest on a project which imports settings from environment variables defined in manage.py

我正在开发一个 Django 项目,其中 SECRET_KEY 等设置在 .env 文件中定义,manage.py 使用 python-dotenv 设置环境变量如下:

from dotenv import load_dotenv, find_dotenv

if __name__ == "__main__":
    load_dotenv(find_dotenv())
    # usual manage.py code

然后settings.py简单地从环境变量定义模块级设置,例如

SECRET_KEY = os.environ['SECRET_KEY']

我现在正在切换到 pytest-django 进行单元测试。然而,问题是如果没有 运行ning python manage.py 首先,环境变量不会被设置,所以我最终得到

E   KeyError: 'SECRET_KEY'

我现在考虑解决这个问题的方法是定义一个自定义操作,以使用 manage.py 注册到 运行 pytest(在 https://docs.djangoproject.com/en/2.0/howto/custom-management-commands/ 之后)。不过,这似乎有点像用大锤敲坚果。有没有更优雅的方法来解决这个问题的建议?

另一种方法可能是为 Django 创建一个测试运行器,如 https://pytest-django.readthedocs.io/en/latest/faq.html#how-can-i-use-manage-py-test-with-pytest-django

中所述

您可以使用 os.getenv('SECRET_KEY'),如果没有这样的环境变量,它将 return None。这等同于 os.environ.get('SECRET_KEY') 并且类似地允许可选的第二个参数作为默认值(例如 os.getenv('SECRET_KEY', 'my-default-key').

这是我从事的大多数项目都采用的方法,既出于测试原因,也出于本地开发原因。