You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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文件存菜单,直接从数据库动态生成更灵活:

  1. 创建Menu模型,存储菜单项的名称、URL、层级等字段;
  2. 通过上下文处理器或自定义模板标签,在base.html中动态渲染菜单:
{% for item in menu_items %}
    <li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endfor %}

修改菜单直接在后台操作,无需修改模板,彻底避免缓存问题。


内容的提问来源于stack exchange,提问作者Michael Romanov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 10:13:18