我正在使用Django 2.1.7版本:
我已经阅读了很多文章和有关此问题。我发现人们使用各种方法。
Approches used in the general are:
1) setting environmental variables
2) multiple settings
3) load configuration variables from a file like using django-environ etc
Approach 1:
我不会使用,因为我不想使用环境变量来存储变量。
Approach 3:
使用3rd party库,有时可能不再维护它们。但是,如果有任何标准方法可以做到这一点,那么我很好。
Approach 2:
在这里,我不确定如何分别存储敏感数据。
有人可以在这方面指导我。
答案 0 :(得分:0)
我正在使用所有这些的组合:
[Service]
Environment="DJANGO_SETTINGS_MODULE=myapp.settings.production"
Environment="DATABASE_NAME=MYDB"
Environment="DATABASE_USER=MYUSER"
Environment="DATABASE_PASSWORD=MYPASSWORD"
...
为了能够运行管理命令,例如要在生产环境中迁移数据库,您还需要这些变量,因此,如果未设置环境变量,我将直接从此文件中获取它们。所以在我的设置中,我有这样的东西:
def get_env_variable(var_name):
try:
return os.environ[var_name]
except KeyError:
env = fetch_env_from_gunicorn()
return env[var_name]
def fetch_env_from_gunicorn():
gunicorn_conf_directory = '/etc/systemd/system/gunicorn.service.d'
gunicorn_env_filepath = '%s/gunicorn.conf' % (gunicorn_conf_directory,)
if not os.path.isfile(gunicorn_env_filepath):
raise ImproperlyConfigured('No environment settings found in gunicorn configuration')
key_value_reg_ex = re.compile(r'^Environment\s*=\s*\"(.+?)\s*=\s*(.+?)\"$')
environment_vars = {}
with open(gunicorn_env_filepath) as f:
for line in f:
match = key_value_reg_ex.search(line)
if match:
environment_vars[match.group(1)] = match.group(2)
return environment_vars
...
DATABASES = {
...
'PASSWORD': get_env_variable('DATABASE_PASSWORD'),
...}
请注意,我在托管实例中运行的所有管理命令都需要显式传递--settings=myapp.settings.production
,以便它知道要使用哪个设置文件。
针对不同类型环境的不同设置。这是因为,DEBUG
之类的内容以及邮件设置,身份验证设置等…在环境之间差异太大,无法使用一个单独的设置文件。
我在 settings 目录中具有 default.py 设置,其中包含所有常用设置,然后例如 production.py 以from .default import *
开头并且仅覆盖需要覆盖的内容,例如DEBUG = False
和其他DATABASES
(使用上述机制),LOGGING
等...
这样,您将面临以下安全风险:
from django.conf import settings
来读取settings
。与上述相同,仍然应加以限制。