1

我有一个 Django 应用程序,我在其中使用 python 解耦和单独的.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 的解决方案

4

2 回答 2

1

我不喜欢其他答案,因为在已经拥有单独的 .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

设置.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)
于 2021-03-03T05:11:52.563 回答
-1

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

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

django 文档中查找示例。

于 2021-01-21T19:04:23.897 回答