在settings.py中,如果只在一个环境中使用,环境变量应该如何loaded/set?

In settings.py, how should environment variables be loaded/set if they're only used in one environment?

我有一个 Django 应用程序,我在其中使用 python-decouple 和单独的 .env 文件处理环境变量。这适用于同时存在于开发和生产环境中的变量,例如 DEBUG.

SECRET_KEY = config('SECRET_KEY')
DEBUG = config('DEBUG', cast=bool)
ALLOWED_HOSTS = config('ALLOWED_HOSTS', cast=Csv())

虽然 DEBUG 在每个环境中都有不同的值,但其他变量如 SECURE_HSTS_SECONDS 只需要在生产中设置,而根本不需要在开发中设置。我目前只是在我的 settings.py 文件中对这些值进行硬编码:

if not DEBUG:
    SECURE_HSTS_SECONDS = 60
    SECURE_HSTS_INCLUDE_SUBDOMAINS = True
    SECURE_REFERRER_POLICY = 'same-origin'
    SECURE_HSTS_PRELOAD = True
    SECURE_SSL_REDIRECT = True
    SESSION_COOKIE_SECURE = True
    CSRF_COOKIE_SECURE = True

我想我可以将这些值包含在我的开发 .env 文件中并将它们设置为默认值,但这似乎没有必要。有没有更简洁的方法来实现这个或最佳实践?我更喜欢使用 python-decouple

的解决方案

最好有两个(dev/prod)或三个(base/dev/prod)设置文件。这是通过相应地设置 DJANGO_SETTINGS_MODULE 环境变量来完成的。

因此,您可以将生产环境的设置放入不同的文件中。此外,您可以采用三文件方法,将常用设置添加到 base.py 文件中,然后将其导入到 prod.pydev.py 文件中。

django docs 中查找示例。

我不喜欢另一个答案,因为在已有单独的 .env 文件之上添加多个设置文件似乎不必要地复杂。我将不得不在我的开发环境和生产环境之间维护单独的环境文件、设置文件和 wsgi.py/asgi.py 文件。

相反,我只是在我的 dev .env 文件中包含了与我的 prod .env 文件相同的变量,并手动设置了默认值。这样,我只需要在 dev/prod 之间维护单独的 .env 文件。在设置文件中的 config() 函数中设置“默认”参数可能会更简洁一些,但我喜欢每个 .env 文件具有相同变量的对称性,所以这只是个人选择。

.env.dev :

DEBUG=True
ALLOWED_HOSTS=localhost, 127.0.0.1
SECURE_HSTS_SECONDS=0
SECURE_HSTS_INCLUDE_SUBDOMAINS=False
SECURE_HSTS_PRELOAD=False
SECURE_SSL_REDIRECT=False
SESSION_COOKIE_SECURE=False

.env.prod :

DEBUG=False
ALLOWED_HOSTS=mysite.com
SECURE_HSTS_SECONDS=2592000
SECURE_HSTS_INCLUDE_SUBDOMAINS=True
SECURE_HSTS_PRELOAD=True
SECURE_SSL_REDIRECT=True
SESSION_COOKIE_SECURE=True

settings.py :

DEBUG = config('DEBUG', cast=bool)

ALLOWED_HOSTS = config('ALLOWED_HOSTS', cast=Csv())

#HSTS settings
SECURE_HSTS_SECONDS = config('SECURE_HSTS_SECONDS', cast=int)
SECURE_HSTS_INCLUDE_SUBDOMAINS = config('SECURE_HSTS_INCLUDE_SUBDOMAINS', cast=bool)
SECURE_HSTS_PRELOAD = config('SECURE_HSTS_PRELOAD', cast=bool)
#HTTPS settings
SECURE_SSL_REDIRECT = config('SECURE_SSL_REDIRECT', cast=bool)
SESSION_COOKIE_SECURE = config('SESSION_COOKIE_SECURE', cast=bool)