我目前很难将环境变量传递给Gunicorn用于我的Django项目。我是最新的19.1版本。我有一个像这样的wsgi.py文件:
import os
import sys
from django.core.wsgi import get_wsgi_application
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
PROJECT_DIR = os.path.abspath(os.path.join(BASE_DIR, '..'))
sys.path.append(PROJECT_DIR)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings")
def application(environ, start_response):
_application = get_wsgi_application()
os.environ['SERVER_ENV'] = environ['SERVER_ENV']
os.environ['SERVER_ID'] = environ['SERVER_ID']
return _application(environ, start_response)
当我从命令行运行gunicorn时:
SERVER_ENV=TEST SERVER_ID=TEST gunicorn -b 127.0.0.1:8080 --error-logfile - --access-logfile - app.wsgi:application
然后我将请求传递给gunicorn我一直得到:
2014-08-01 08:39:17 [21462] [ERROR] Error handling request
Traceback (most recent call last):
File "/opt/virtualenv/python-2.7.5/django-1.5.5/lib/python2.7/site-packages/gunicorn/workers/sync.py", line 93, in handle
self.handle_request(listener, req, client, addr)
File "/opt/virtualenv/python-2.7.5/django-1.5.5/lib/python2.7/site-packages/gunicorn/workers/sync.py", line 134, in handle_request
respiter = self.wsgi(environ, resp.start_response)
File "/opt/sites/itracker/wsgi.py", line 18, in application
os.environ['SERVER_ENV'] = environ['SERVER_ENV']
KeyError: 'SERVER_ENV'
打印出环境值确认环境变量未被传入。我已尝试在virtualenv激活脚本中设置环境变量,也在专用的gunicorn shell脚本中设置环境变量,并使用环境变量设置--env标志,但似乎没有任何作用。
有什么想法吗?
答案 0 :(得分:6)
部署gunicorn.service
时遇到了类似的问题。我通过文件将环境变量传递给它:
<on gunicorn.service>
[Service]
...
EnvironmentFile=/pathto/somefilewith_secrets
...
例如(cat /etc/systemd/system/gunicorn.service
)
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/10008/digichainOpen
EnvironmentFile=/home/ubuntu/10008/digichainOpen/.env
ExecStart=/home/ubuntu/.local/share/virtualenvs/digichainOpen-Zk2Jnvjv/bin/gunicorn \
--worker-class=gevent --workers 4 \
--bind unix:/home/ubuntu/10008/digichainOpen/gunicorn.sock digichainOpen.wsgi:application
[Install]
WantedBy=multi-user.target
答案 1 :(得分:5)
您只需要导出环境变量。
export SERVER_ENV=TEST
export SERVER_ID=TEST
gunicorn -b 127.0.0.1:8080 --error-logfile - --access-logfile - app.wsgi:application
在你的代码中你可以像那样得到它们
os.getenv('SERVER_ENV')
答案 2 :(得分:1)
我不太明白你在这里要做什么。如果您在bash命令行中传递环境变量,它们在os.environ
中已经:无需从其他任何地方获取它们。 environ
字典由从请求传递的元素组成,而不是shell。
答案 3 :(得分:0)
非常感谢两位都有效的回复。我误解了environ
词典的起源,即我没有意识到它是由请求而不是shell传递的元素组成的。再次感谢。