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

Django模型更新时动态刷新HTML页面的极简示例需求

实现Django数据库更新时前端实时刷新的极简方案

这里给你提供两种极简实现方式,不用纠结复杂的框架配置:

方案一:轮询(零配置,适合小流量/低频率更新场景)

前端定时请求后端接口拉取最新数据,直接更新页面内容。

后端视图代码

# views.py
from django.http import JsonResponse
from .models import Status

def get_latest_status(request):
    # 假设仅需展示单个Status实例,按需调整筛选逻辑
    status = Status.objects.first()
    return JsonResponse({
        'core_field': status.core_field,
        'progress': status.progress,
        # 其他需要展示的字段
    })

前端页面代码

<!-- 报表展示区域 -->
<div class="status-report">
  <p>核心字段:<span id="core-field"></span></p>
  <p>当前进度:<span id="progress"></span>%</p>
</div>

<script>
// 刷新数据函数
function updateStatus() {
  fetch('/get-latest-status/') // 对应后端路由地址
    .then(res => res.json())
    .then(data => {
      document.getElementById('core-field').textContent = data.core_field;
      document.getElementById('progress').textContent = data.progress;
    });
}

// 页面加载时初始化数据,之后每2秒刷新一次
window.onload = () => {
  updateStatus();
  setInterval(updateStatus, 2000);
};
</script>

路由配置

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    # 其他路由...
    path('get-latest-status/', views.get_latest_status, name='get_latest_status'),
]

方案二:Django Channels + WebSocket(真正实时,适合高频率更新场景)

用3.x版本的Channels,配置比1.x简洁很多:

1. 安装依赖

pip install channels==3.0.4

2. 修改项目settings.py

INSTALLED_APPS = [
    # 原有应用...
    'channels',
]

# 指定ASGI应用
ASGI_APPLICATION = '你的项目名.asgi.application'

# 开发环境用内存通道层
CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels.layers.InMemoryChannelLayer",
    },
}

3. 改写asgi.py

# asgi.py
import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from . import routing

os.environ.setdefault('DJANGO_SETTINGS_MODULE', '你的项目名.settings')

application = ProtocolTypeRouter({
    "http": get_asgi_application(),
    "websocket": URLRouter(routing.websocket_urlpatterns),
})

4. 创建路由文件routing.py

# routing.py
from django.urls import path
from . import consumers

websocket_urlpatterns = [
    path('ws/status/', consumers.StatusConsumer.as_asgi()),
]

5. 创建消费者文件consumers.py

# consumers.py
from channels.generic.websocket import WebsocketConsumer
import json
from .models import Status
from django.db.models.signals import post_save
from django.dispatch import receiver

# 监听Status模型保存事件,触发实时推送
@receiver(post_save, sender=Status)
def push_status_update(sender, instance, **kwargs):
    StatusConsumer.broadcast_update(instance)

class StatusConsumer(WebsocketConsumer):
    # 维护在线客户端集合
    active_clients = set()

    def connect(self):
        self.accept()
        self.active_clients.add(self)
        # 连接成功时先推送一次最新数据
        latest_status = Status.objects.first()
        self.send(text_data=json.dumps({
            'core_field': latest_status.core_field,
            'progress': latest_status.progress,
        }))

    def disconnect(self, close_code):
        self.active_clients.remove(self)

    @classmethod
    def broadcast_update(cls, instance):
        update_data = json.dumps({
            'core_field': instance.core_field,
            'progress': instance.progress,
        })
        # 给所有在线客户端推送更新
        for client in cls.active_clients:
            client.send(text_data=update_data)

6. 前端WebSocket代码

<div class="status-report">
  <p>核心字段:<span id="core-field"></span></p>
  <p>当前进度:<span id="progress"></span>%</p>
</div>

<script>
// 建立WebSocket连接
const ws = new WebSocket('ws://' + window.location.host + '/ws/status/');

// 接收后端推送的更新
ws.onmessage = function(event) {
    const data = JSON.parse(event.data);
    document.getElementById('core-field').textContent = data.core_field;
    document.getElementById('progress').textContent = data.progress;
};

// 连接断开时自动重连
ws.onclose = function() {
    setTimeout(() => window.location.reload(), 3000);
};
</script>

选择建议

  • 轮询方案适合更新频率低的场景,无需额外配置,开发速度快。
  • WebSocket方案适合需要实时感知数据变化的场景,生产环境需搭配Daphne等ASGI服务器部署。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 12:37:06