.env 在 uwsgi 上使用 django-environ 重新加载
.env reload with django-environ on uwsgi
我真的需要来点劲儿。
我确实有完整的设置和 运行 项目。 Django、nginx、supervisor、uwsgi - 启用了触摸重载的 emperor。
# {{ 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 文件内容。
谢谢
所以答案是不用django-environ
django-environ: ... strings from os.environ are loaded from a .env file and filled
in os.environ with setdefault method, to avoid to overwrite the real
environ.
这就是诀窍,如果您的代码已经设置了一些环境变量,它不会在 uwsgi 重新加载时更新,为此,您必须重新启动整个服务 -> 这与零停机部署不符也没有触摸重新加载。
使用 python-dotenv
您可以覆盖此行为并在每次重新加载时更新您的环境,它甚至适用于 django 开发服务器。
祝大家编程愉快!
我真的需要来点劲儿。 我确实有完整的设置和 运行 项目。 Django、nginx、supervisor、uwsgi - 启用了触摸重载的 emperor。
# {{ 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 文件内容。
谢谢
所以答案是不用django-environ
django-environ: ... strings from os.environ are loaded from a .env file and filled in os.environ with setdefault method, to avoid to overwrite the real environ.
这就是诀窍,如果您的代码已经设置了一些环境变量,它不会在 uwsgi 重新加载时更新,为此,您必须重新启动整个服务 -> 这与零停机部署不符也没有触摸重新加载。
使用 python-dotenv
您可以覆盖此行为并在每次重新加载时更新您的环境,它甚至适用于 django 开发服务器。
祝大家编程愉快!