WEB程序员笔记

一个前端开发工程师的个人博客

Django:摘录摘录

在司法法院,输家是赢家,死者是输家。-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_PASSWORDDATABASE_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',
    }
}

重新启动不会产生错误,但可以成功运行。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注