Django使用环境变量拆分设置环境

时间:2013-03-22 00:48:21

标签: python django environment-variables

我的Django设置文件有common.pydev.pyprod.py。所有文件都继承自common.py。我希望将我的数据库密码,数据库URL等存储为环境变量&离开我的在线存储库。

我已经在Stackoverflow和网络上研究了环境变量,但我不确定我是否对它有清楚的了解。

我应该在我的bash shell中输入什么内容,或者export SOMEAPP_DB_USER='someapp'export SOMEAPP_DB_PASSWORD='1234'之类的内容,请加入我的bash_profile

如果命令是通过shell发出的,那么它只适用于我所在的终端会话,还是在我调用应用程序虚拟环境时永久设置?

设置文件应如下设置吗?

DATABASE_USER = os.environ.get("SOMEAPP_DB_USER", ")
DATABASE_PASSWORD = os.environ.get("SOMEAPP_DB_PASSWORD", ")

1 个答案:

答案 0 :(得分:3)

环境与进程相关联,并且父进程分叉时继承的副本。在运行另一个命令之前,您可以将bash注入设置放入环境中。

以下命令将使用现有的bash环境运行./manage runserver,并添加两个额外的环境变量DJANGO_SETTINGS_MODULEMY_DB_PASSWORD

DJANGO_SETTINGS_MODULE=myproject.settings.dev MY_DB_PASSWORD=foo ./manage.py runserver

如您所知,您可以在设置文件中使用以下Python代码从环境中提取值。

import os
db_passwd = os.environ.get('MY_DB_PASSWORD', 'default-db-password')

您可以将密码放在.profile中,但这可能不是一个好主意,因为您的敏感信息会与非敏感信息混合在一起。然后,您必须保护.profile文件权限,否则其他人只需阅读该文件即可获取您的密码。

我认为在这种情况下,更好的设置管理方法是使用专用于敏感设置(如密码)的单独文件。将此文件的权限保护为只有需要它的用户才能读取,例如您的Web服务器。然后,您可以从settings.py读取此密码文件以获取密码。在这里使用Python ConfigParser module可能很有用。

如果需要,您可以使用环境变量指定此文件的位置,如果没有指定,则可以回退到默认值。

例如。     DB_PASSWD_FILE =〜/ tmp / test_db_passwords.ini ./manage.py runserver

然后在settings.py

import os
db_passwd_file = os.environ.get('DB_PASSWD_FILE', '/etc/myproject/db_passwords.ini')

# Instantiate a ConfigParser object here to read passwords from db_passwd_file.

这允许默认行为查看受系统保护的文件/etc/myprojecdt/db_passwords.ini,除非该位置已被DB_PASSWD_FILE环境变量覆盖。

在开发过程中,您可以将DB_PASSWD_FILE设置为指向.profile中用于开发目的的理智位置。 DB_PASSWD_FILE指向的路径可以使用文件系统权限进行保护,以便您可以读取。