.env在uwsgi上用django-environ重新加载

时间:2019-08-13 20:45:49

标签: django dotenv

我真的需要一拳。 我确实有完整的设置并正在运行项目。 Django,nginx,supervisor,uwsgi-启用触摸重新加载的皇帝。

 # {{ ansible_managed }}

[Unit]
Description=uWSGI Emperor service

[Service]
ExecStartPre=/bin/bash -c 'mkdir -p /run/uwsgi; chown {{ deploy_user }}:{{ deploy_group }} /run/uwsgi'
ExecStart=/bin/bash -c '{{ uwsgi_path }}/uwsgi --emperor /etc/uwsgi/vassals'
Restart=always
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all

[Install]
WantedBy=multi-user.target

uwsgi.ini

# {{ ansible_managed }}

[uwsgi]
project = {{ project_name }}
uid = {{ deploy_user }}
gid = {{ deploy_group }}
base = /home/%(uid)

chdir = %(base)/www/{{ project_url }}/%(project)
home = %(base)/.pyenv/versions/%(project)
module = config.wsgi
;logto = /tmp/uwsgi.log

master = true
processes = 10
harakiri = 30

socket = /run/uwsgi/%(project).sock
chown-socket = %(uid):%(gid)
chmod-socket = 660
vacuum = true

touch-reload = {{ project_path }}/{{ project_name }}.touch

LANG=en_US.UTF-8
env = DJANGO_READ_DOT_ENV_FILE=True
;todo version for prod
env = DJANGO_SETTINGS_MODULE=config.settings.{{ version }}

当我进行更改并触摸文件时,它将按需重新加载所有内容,从而使项目运行正常。

但是我确实对.env文件有问题。

django settings.py

import environ
...
env = environ.Env(
    # set casting, default value
    DEBUG=(bool, False)
)
# reading .env file
env.read_env(str(ROOT_DIR.path('.env')))

如果我更改了.env文件中的某些内容并将其上传到服务器,请触摸wsgi文件,它不反映.env文件中的更改。如果我手动调用“ service uwsgi.project restart”,它将加载新文件内容。

问题:我是否错过了配置中的某些内容?触摸文件时,如何强制uwsgi重新加载.env文件内容。

谢谢

1 个答案:

答案 0 :(得分:1)

所以答案是不要使用django-environ

  

django-environ:... os.environ中的字符串从.env文件加载并填充   在os.environ中使用setdefault方法,以避免覆盖真实   环境。

这就是诀窍,如果您的代码已经设置了一些env变量,则不会在uwsgi重载时对其进行更新,为此,您必须重新启动整个服务->零停机时间部署或零停机都无法实现触摸重新加载。

使用python-dotenv,您可以覆盖此行为并在每次重新加载时更新环境,即使在django dev服务器上也可以使用。

快乐的编码专家!