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

如何在Django中每隔X秒检查数据库表值并触发页面跳转?

Django中定时检查数据库值并自动重定向的解决方案

问题需求

在Django项目中,需要每隔X秒检查数据库表中的某个值,当该值达到预期条件时,自动将用户重定向到指定页面。

你遇到的问题

你尝试过用表单每隔3秒提交一次,后端检查数据库,但前端的sleep函数阻塞了浏览器导致页面无法正常加载,即便改用setTimeout/setInterval也没解决问题。

你的原有代码:

后端Python代码

def wait(request, slug):
    form = MatchForm()
    if request.method == 'POST':
        roomName = Match.objects.get(roomname = slug)
        if (int(roomName.num_players) > 1):
            return redirect(f'../play/{slug}')
    
    return render (request, 'chess/waiting_room.html', {'slug':slug, 'form':form})

前端JavaScript代码

function sleep(milliseconds) {
  const date = Date.now();
  let currentDate = null;
  do {
    currentDate = Date.now();
  } while (currentDate - date < milliseconds);
}

subm_form()

function subm_form(){
  var form = $("#form")
  form.submit();
  sleep(3000)
  subm_form()
};

正确解决方案

方案1:AJAX轮询(简单易实现)

通过前端定时发送异步请求到后端接口,检查数据库状态,不刷新页面,符合条件后直接跳转。

1. 修改后端代码

新增一个API视图用于检查状态,返回JSON结果:

from django.http import JsonResponse
from django.shortcuts import get_object_or_404

def check_room_status(request, slug):
    room = get_object_or_404(Match, roomname=slug)
    # 判断是否满足跳转条件
    is_ready = int(room.num_players) > 1
    return JsonResponse({'is_ready': is_ready, 'play_url': f'/play/{slug}'})

# 保留原有的wait视图,用来渲染等待页面
def wait(request, slug):
    return render(request, 'chess/waiting_room.html', {'slug': slug})

同时在urls.py中添加对应路由:

path('wait/<slug:slug>/', views.wait, name='wait'),
path('check-room/<slug:slug>/', views.check_room_status, name='check_room_status'),

2. 修改前端代码

移除表单提交逻辑,改用setInterval发送AJAX请求:

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(document).ready(function() {
    // 每隔3秒检查一次状态
    const checkInterval = setInterval(function() {
        $.ajax({
            url: `/check-room/{{ slug }}/`,
            type: 'GET',
            success: function(response) {
                if (response.is_ready) {
                    // 满足条件,清除定时器并跳转
                    clearInterval(checkInterval);
                    window.location.href = response.play_url;
                }
            },
            error: function() {
                console.log('检查状态失败');
            }
        });
    }, 3000); // 3秒间隔
});
</script>

方案2:WebSocket(实时性更高)

如果需要更低延迟的实时通知,可以用Django Channels实现WebSocket,后端主动推送状态变化给前端,避免轮询浪费资源。不过实现相对复杂,适合对实时性要求高的场景。

原有方法失效原因

  • 前端的sleep是同步阻塞函数,会卡住浏览器主线程,导致页面无法响应。
  • 表单提交会触发页面刷新,用户体验差,且每次刷新都会重新加载页面资源。
  • 后端仅在POST请求时检查状态,没有提供专门的状态查询接口。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 09:39:22