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

如何在Django中用js2py实现页面自动刷新?报错排查

问题原因

你用js2py执行window.location.reload(true)报错,是因为js2py运行在Python环境中,没有浏览器的上下文——window和location都是浏览器专属的API,js2py的JS环境里根本不存在这些对象,自然会提示找不到reload属性。

可行解决方案

因为刷新浏览器是前端客户端的行为,后端脚本没法直接控制用户的浏览器,所以得换思路实现:

方案1:前端定时刷新/检查更新

直接在你的网站页面中加入JS代码,让前端自己处理刷新逻辑,和后端的15分钟更新周期同步:

简单定时刷新(直接同步后端周期)

<script>
  // 每15分钟自动刷新一次,和后端脚本的900秒间隔一致
  setInterval(() => {
    window.location.reload(true);
  }, 900000); // 900000毫秒 = 15分钟
</script>

优雅版:检查更新后再刷新

如果不想盲目刷新,可以让前端定时请求后端的更新状态,有更新时再刷新:

  1. 后端新增一个视图接口,返回是否有数据更新(比如记录最后一次数据更新的时间戳):
# views.py
from django.http import JsonResponse
from django.utils import timezone

def check_update(request):
    # 假设你有一个存储最后更新时间的变量/模型字段
    last_update_time = ... # 从你的数据模型或缓存中获取最后更新时间
    client_last_update = request.GET.get('last_update', 0)
    has_update = last_update_time > int(client_last_update)
    return JsonResponse({
        'has_update': has_update,
        'current_update': int(last_update_time.timestamp())
    })
  1. 前端加入检查逻辑:
<script>
  let lastUpdate = 0;
  // 每30秒检查一次是否有更新
  setInterval(async () => {
    const response = await fetch(`/check-update/?last_update=${lastUpdate}`);
    const data = await response.json();
    if (data.has_update) {
      lastUpdate = data.current_update;
      window.location.reload(true);
    }
  }, 30000);
</script>

方案2:用WebSocket主动通知前端刷新

如果需要后端更新完成后立刻通知前端刷新,可以用WebSocket实现实时推送:

  1. 用Django Channels搭建WebSocket服务(需要先安装Channels相关依赖),后端在数据更新完成后发送刷新指令:
# 在你的脚本中,执行完feed_update后发送WebSocket消息
from channels.layers import get_channel_layer
from asgiref.sync import async_to_sync

def send_refresh_notification():
    channel_layer = get_channel_layer()
    # 发送消息到名为refresh_group的组
    async_to_sync(channel_layer.group_send)(
        'refresh_group',
        {
            'type': 'send_refresh',
            'message': 'refresh_page'
        }
    )

# 循环中调用
while True:
    call_command("feed_update")
    send_refresh_notification()
    time.sleep(900)
  1. 前端连接WebSocket,收到消息后刷新:
<script>
  const ws = new WebSocket(`ws://${window.location.host}/ws/refresh/`);
  ws.onmessage = function(event) {
    const message = JSON.parse(event.data);
    if (message.message === 'refresh_page') {
      window.location.reload(true);
    }
  };
</script>
总结

js2py这条路走不通,因为它没法模拟浏览器环境控制客户端页面。推荐用方案1(前端定时逻辑),实现简单且足够满足需求;如果需要实时刷新,再考虑方案2的WebSocket方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 04:45:43