Django开发:代码变更后如何自动重启Gunicorn?
解决Django模板变更后Gunicorn缓存不更新的问题
一、先排查Django自身模板缓存配置
打开项目的settings.py,检查TEMPLATES配置里的OPTIONS项,确保没有启用模板缓存加载器:
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ # 保留你的上下文处理器配置 ], # 若存在以下缓存加载器配置,直接注释或删除 # 'loaders': [ # ('django.template.loaders.cached.Loader', [ # 'django.template.loaders.filesystem.Loader', # 'django.template.loaders.app_directories.Loader', # ]), # ], }, }, ]
如果启用了cached.Loader,Django会把编译后的模板缓存到内存,修改模板后不会自动刷新,移除该配置即可让Django每次请求都重新加载模板。
二、Gunicorn层面的解决方案
1. 开发环境:启用自动重载
启动Gunicorn时添加--reload参数,它会监听文件变更自动重启Worker进程:
gunicorn your_project.wsgi:application --reload
注意:该参数仅适合开发环境,生产环境频繁重启会影响服务稳定性。
2. 生产环境:文件变更触发自动重启
用inotify-tools监听模板文件目录,当文件修改/新增/删除时自动重启Gunicorn。写个简单脚本:
#!/bin/bash # 监听模板includes目录的变更 while inotifywait -r -e modify,create,delete /path/to/your/templates/includes/; do # 根据你的Gunicorn管理方式执行重启命令,比如systemd systemctl restart gunicorn done
将脚本设为后台服务运行,即可实现模板变更后自动重启Gunicorn。
三、通过Django Page模型保存触发自动重启
如果菜单变更依赖Page模型的保存操作,可以在模型的save方法中添加异步重启逻辑:
from django.db import models import subprocess from celery import shared_task # 异步任务:重启Gunicorn @shared_task def restart_gunicorn(): # 需确保Django运行用户有执行该命令的权限(比如给www-data配置sudo免密) subprocess.run(["sudo", "systemctl", "restart", "gunicorn"], check=True) class Page(models.Model): title = models.CharField(max_length=200) content = models.TextField() def save(self, *args, **kwargs): super().save(*args, **kwargs) # 触发异步重启任务,避免阻塞请求 restart_gunicorn.delay()
注意:这种方式仅针对Page模型保存触发的菜单变更,直接修改HTML模板文件不会触发。
四、更优替代:动态渲染菜单
没必要依赖静态HTML文件存菜单,直接从数据库动态生成更灵活:
- 创建
Menu模型,存储菜单项的名称、URL、层级等字段; - 通过上下文处理器或自定义模板标签,在
base.html中动态渲染菜单:
{% for item in menu_items %} <li><a href="{{ item.url }}">{{ item.name }}</a></li> {% endfor %}
修改菜单直接在后台操作,无需修改模板,彻底避免缓存问题。
内容的提问来源于stack exchange,提问作者Michael Romanov
相关产品推荐
相关产品推荐

