如何避免使用 Django、nginx 和 uWSGI 将环境变量放到多个地方?

Posted

技术标签:

【中文标题】如何避免使用 Django、nginx 和 uWSGI 将环境变量放到多个地方?【英文标题】:How to avoid putting environment variables into multiple places with Django, nginx and uWSGI? 【发布时间】:2014-07-03 11:18:24 【问题描述】:

我正在尝试配置 nginx+uWSGI 来为我的 Django 应用程序提供服务。

当我将环境变量放入myapp_uwsgi.ini:

uid = username
gid = username
env = DJANGO_SITE_KEY="..."

它按预期工作。

但是,我的应用有一些 management commands,它们也应该可以访问我定义的环境变量。

如果我把环境变量放到/home/username/.bashrc:

export DJANGO_SITE_KEY="..."

uWSGI 不加载它们。

我已经尝试将环境变量放到一个单独的文件中:

#!/bin/sh
export DJANGO_SITE_KEY="..."

然后从两个.bashrc调用它:

. /home/username/environment

myapp_uwsgi.ini:

exec-pre-app = . /home/username/environment

在 uWSGI 日志中,我看到这一行:

running ". /home/username/environment" (pre app)...

但我的 Django 应用无法使用 os.environ 访问环境变量。

我也尝试将export 命令放到 virtualenvwrapper 的 preactivate 钩子上,并使用 uWSGI 的 virtualenv = 设置,但它也不起作用(我假设钩子仅在使用 virtualenvwrapper 命令时执行,例如workon.

【问题讨论】:

【参考方案1】:

这是来自 uWSGI 开发者的the answer:

只需将它们中的每一个(每行一个)放在表单中的文本文件中

VAR=值

然后在 uWSGI 配置中

[uwsgi]
for-readline = yourfile
  env = %(_)
endfor =

这也适用于 yml 配置文件:

  for-readline: filename
    env: %(_)
  endfor:

【讨论】:

管理命令如何——用 bash 解析文本文件? 你的意思是解析myapp_uwsgi.ini吗?我不认为这是一个正确的方法。更改网络服务器会破坏事情。 不,就是对txt文件的解析才是正确的做法。我和你一起去,我正在用 venv 的激活脚本中的 env 变量解析 txt 文件。 请注意,值不应被引用,因为解析文件时uWSGI doesn't drop quotes。如果确实引用了它们,则在应用程序中使用它们时必须从所有值中去掉引号。 使用这种方法的export关键字怎么样?如果您使用任何需要知道特定目录和文件位置的工具,导出环境变量非常有用。【参考方案2】:

我使用django-dotenv。将您的环境变量放在项目中的 .env 之类的文件中,然后将其加载到 manage.py 和 wsgi.py 中。无需其他配置。 uwsgi 和 manage.py 命令将按预期工作,所有环境变量都存储在一个文件中。

【讨论】:

【参考方案3】:

另一种方法是使用配置管理系统,例如Salt 或Ansible。

有了它们,我们可以为 uWSGI 和 Django 创建 Jinja 模板,并在一个地方定义了 variables 。

【讨论】:

以上是关于如何避免使用 Django、nginx 和 uWSGI 将环境变量放到多个地方?的主要内容,如果未能解决你的问题,请参考以下文章

Django+Linux+Uwsgi+Nginx项目部署文档

nginx+uwsgi+Django(基于CentOS)

mac+django(1.8.2)+uwsgi+nginx 部署

如何使用 uWS 访问 HTTP 请求的 IP 地址?

如何避免 Django Forms 和 Django Rest Framework Serializers 中的代码重复?

Django/Python DRY:使用 Q 对象和模型属性时如何避免重复代码