【问题标题】:Secret Key environment variable not working on Ubuntu. Django, Postgres, Gunicorn, Nginx, Virtualenv密钥环境变量在 Ubuntu 上不起作用。 Django、Postgres、Gunicorn、Nginx、Virtualenv
【发布时间】:2017-08-21 03:02:21
【问题描述】:

这是我在 virtualenv 处于活动状态时尝试运行 makemigrations 命令时遇到的以下错误:

Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    execute_from_command_line(sys.argv)
  File "/home/tony/vp/vpenv/lib/python3.5/site-packages/django/core/management/__init__.py", line 363, in execute_from_command_line
    utility.execute()
  File "/home/tony/vp/vpenv/lib/python3.5/site-packages/django/core/management/__init__.py", line 307, in execute
    settings.INSTALLED_APPS
  File "/home/tony/vp/vpenv/lib/python3.5/site-packages/django/conf/__init__.py", line 56, in __getattr__
    self._setup(name)
  File "/home/tony/vp/vpenv/lib/python3.5/site-packages/django/conf/__init__.py", line 41, in _setup
    self._wrapped = Settings(settings_module)
  File "/home/tony/vp/vpenv/lib/python3.5/site-packages/django/conf/__init__.py", line 110, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "/home/tony/vp/vpenv/lib/python3.5/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 986, in _gcd_import
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load
  File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 665, in exec_module
  File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
  File "/home/tony/vp/vp/config/settings/production.py", line 1, in <module>
    from .base import *
  File "/home/tony/vp/vp/config/settings/base.py", line 22, in <module>
    SECRET_KEY = os.environ["VP_SECRET_KEY"]
  File "/home/tony/vp/vpenv/lib/python3.5/os.py", line 725, in __getitem__
    raise KeyError(key) from None
KeyError: 'VP_SECRET_KEY'

我在三个位置设置了我的环境变量:

在我的虚拟环境 bin/activate 脚本中

Environment=VP_SECRET_KEY="****"

Environment=VP_DB_PASS="****"

.bashrc 文件中:

VP_SECRET_KEY="****"

VP_DB_PASS="****"

在我的 gunicorn.service 文件中:

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=tony
Environment=VP_SECRET_KEY="****"
Environment=VP_DB_PASS="****"
Group=www-data
WorkingDirectory=/home/tony/vp/vp/
ExecStart=/home/tony/vp/vpenv/bin/gunicorn --workers 3 --bind unix:/home/tony/vp/vp/vp.sock vp.wsgi:application


[Install]
WantedBy=multi-user.target

这是我在 settings base.py 中导入它的方法(我使用多个设置文件):

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = os.environ["VP_SECRET_KEY"]

当我使用 $VP_SECRET_KEY 回显它们时,我确实得到了返回的值。

什么会导致这个问题?是不是通过将它们设置在多个位置会产生某种冲突?

【问题讨论】:

  • 为什么不简单地将SECRET_KEY = 添加到local_settings.py 并将其导入settings.py ?当然你需要将local_settings.py 添加到.gitignore
  • 我的所有设置文件(base.py、production.py、local.py)都受版本控制。出于安全原因,我不希望我的密钥在其中任何一个中可见。如果这就是你的意思:P
  • 好的,创建新的例如secret.py 将它添加到.gitignore,为什么不呢?
  • 感谢@BearBrown,但我尝试做的事情得到了 Tarun Lalwani 在他的回答中的回答!不过谢谢!
  • 完全没有,如你所愿)

标签: django postgresql nginx environment-variables gunicorn


【解决方案1】:

问题是您正在查看 SESSION 变量

$ MYNAME=TARUN
$ env

env 的输出不会显示 MYNAME,因为它是当前 BASH 中的一个变量。所以你需要导出它

export VP_SECRET_KEY="****"    
export VP_DB_PASS="****"

编辑 1

如果你愿意,也可以通过 gunicorn 传递环境变量

ExecStart=/home/tony/vp/vpenv/bin/gunicorn -e VP_SECRET_KEY=***** --workers 3 --bind unix:/home/tony/vp/vp/vp.sock vp.wsgi:application

【讨论】:

  • 哇,我是个傻瓜!谢谢你,塔伦!不敢相信我忘了导出它们
  • @TonyKyriakidis,不用担心。这就是为什么有人看一看总是好的原因
猜你喜欢
  • 1970-01-01
  • 2017-03-28
  • 2016-03-14
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
  • 2012-11-07
  • 2018-02-09
  • 1970-01-01
相关资源
最近更新 更多