在settings.py中,如果环境变量只在一种环境中使用,应该如何加载/设置它们?

问题描述

我有一个 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

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

解决方法

我不喜欢另一个答案,因为在已有单独的 .env 文件之上添加多个设置文件似乎不必要地复杂。我将不得不在我的开发和生产环境之间维护单独的 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)
,

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

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

django docs 中查找示例。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...