如何避免使用 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项目部署文档
mac+django(1.8.2)+uwsgi+nginx 部署
如何避免 Django Forms 和 Django Rest Framework Serializers 中的代码重复?