我的Django设置文件有common.py
,dev.py
和prod.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", ")
答案 0 :(得分:3)
环境与进程相关联,并且父进程分叉时继承的副本。在运行另一个命令之前,您可以将bash注入设置放入环境中。
以下命令将使用现有的bash环境运行./manage runserver
,并添加两个额外的环境变量DJANGO_SETTINGS_MODULE
和MY_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
指向的路径可以使用文件系统权限进行保护,以便您可以读取。