在司法法院,输家是赢家,死者是输家。-Kannada电影院Boothayyana Maga Ayyu。
在现实世界的项目中,敏感和重要的数据(例如服务器IP地址,凭据等)必须尽可能地保密。
为此,我们有许多工具,实用程序,程序包等。但是在使用这种工具时,可能会出现其他问题。
让我们举例说明。
Django Twangy:
该cookie-cutter
工具是常用的项目模板启动器。并为我们提供了一个干净的文件夹结构.envs
,用于存储数据。
这些数据通过环境变量提供给python代码,例如:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'ecommerce-portal',
'USER': 'postgres',
'PASSWORD': os.environ.get('DATABASE_PASSWORD'),,
'HOST': os.environ.get('DATABASE_HOST', default='localhost'),
'PORT': '5432',
}
}
这里的秘密,例如DATABASE_PASSWORD
,DATABASE_HOST
可以存储在.envs
。
案子:
在上述情况下,如果使用Supervisor
(流程控制系统):在重新启动子流程时,
sudo supervisorctl restart ecommerce_celery
结果可能是这样的:
ecommerce_celery: ERROR (not running)
ecommerce_celery: ERROR (spawn error)
如果检查了子流程工作者日志:
django.db.utils.OperationalError: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
supervisor
在虚拟环境的上下文之外运行,与环境变量分离- 在上述错误情况下,
supervisor
尚未收到要连接的数据库名称。
一种可能的尝试是将数据库名称作为环境变量传递到配置文件中,例如:
environment = DATABASE_HOST="255.254.253.252", .....
在/etc/supervisor/conf.d/ecommerce_celery.conf
。
这似乎不起作用,但继续存在相同错误。
救主:
python-decouple
是一种智能,简单的解决方案,可以轻松解决上述问题。
from decouple import config
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'ecommerce-portal',
'USER': 'postgres',
'PASSWORD': config('DATABASE_PASSWORD'),,
'HOST': config('DATABASE_HOST', default='localhost'),
'PORT': '5432',
}
}
重新启动不会产生错误,但可以成功运行。