2

我有一个common.py,dev.pyprod.py用于我的 Django 设置文件。所有文件都继承自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", ")
4

1 回答 1

3

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

以下命令将./manage runserver在现有的 bash 环境中运行,并添加两个额外的环境变量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 模块的使用在这里可能很有用。

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

例如。DB_PASSWD_FILE=~/tmp/test_db_passwords.ini ./manage.py 运行服务器

然后在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指向的路径可以被保护为仅由您使用文件系统权限读取。

于 2013-03-22T01:48:19.597 回答