19

我目前很难将环境变量传递给我的 Django 项目的 Gunicorn。我使用的是最新的 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 标志设置环境变量但似乎没有任何效果。

有任何想法吗?

4

4 回答 4

24

我在部署时遇到了类似的问题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  

.env文件可以是:

my_var=someValue
some_secret=secretvalue
another_secret=blah
于 2018-04-02T14:40:33.303 回答
11

你只需要导出你的环境变量。

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')
于 2014-08-01T12:22:27.470 回答
0

如果你想使用 gunicorn 配置文件运行 Django:

编写一个 config.py 文件

command = 'venv/bin/gunicorn'
pythonpath = 'venv'
bind = '127.0.0.1:8000'
workers = 2
raw_env = ["VARIABLE_HERE=VARIABLE_VALUE_HERE"]
wsgi_app = "project.wsgi"

像这样运行它:从项目目录中

gunicorn -c config.py
于 2021-09-14T14:41:11.667 回答
-1

我不太明白你想在这里做什么。如果您在 bash 命令行中传递环境变量,它们已经os.environ: 不需要从其他任何地方获取它们。environ字典由请求传递的元素组成,而不是外壳。

于 2014-08-01T09:07:27.610 回答