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

基于Django与Ajax实现定时POST功能的技术求助

嘿,我懂你现在的处境——手动刷新页面能正常通过Ajax拉取TXT的新内容,但自动定时更新这块就是跑不起来对吧?别着急,咱们有两种靠谱的方案能搞定这个问题,看你需求选就行:

方案一:前端定时轮询(简单易上手)

既然你已经用了jQuery的Ajax,那最直接的办法就是在前端加个定时任务,让它自动重复调用你已经写好的请求逻辑。

基础版:固定间隔轮询

比如你要每天更新一次,就用setInterval设置24小时的间隔(注意单位是毫秒,24小时=86400000毫秒):

$(document).ready(function() {
    // 封装获取数据的函数
    function loadLatestTxt() {
        $.ajax({
            url: '/your-data-url/', // 替换成你Django视图的实际URL
            method: 'GET',
            success: function(response) {
                // 把新内容更新到页面上,比如替换某个容器的内容
                $('#txt-content').text(response);
            },
            error: function() {
                console.log('加载数据失败,稍后会重试');
            }
        });
    }

    // 页面加载时先执行一次,避免空白
    loadLatestTxt();
    // 每隔24小时自动执行一次
    setInterval(loadLatestTxt, 86400000);
});

进阶版:固定时间触发(避免时间偏差)

如果你的TXT是每天固定时间更新(比如凌晨0点),用固定间隔可能会慢慢出现时间偏移,这时候可以计算距离下一次更新的时间,用setTimeout循环调度:

$(document).ready(function() {
    function loadLatestTxt() {
        // 和上面一样的Ajax逻辑
        $.ajax({
            url: '/your-data-url/',
            method: 'GET',
            success: function(response) {
                $('#txt-content').text(response);
            }
        });
    }

    function scheduleDailyUpdate() {
        const now = new Date();
        // 计算明天凌晨0点的时间
        const nextUpdate = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1, 0, 0, 0);
        // 计算当前到下一次更新的毫秒差
        const delay = nextUpdate.getTime() - now.getTime();

        setTimeout(function() {
            loadLatestTxt();
            // 完成后继续安排下一天的任务
            scheduleDailyUpdate();
        }, delay);
    }

    // 启动初始加载和定时任务
    loadLatestTxt();
    scheduleDailyUpdate();
});
方案二:后端定时任务+WebSocket推送(高效实时)

如果你的需求更严谨,比如希望TXT更新后立即推送给所有在线用户,而不是等前端轮询,那就可以用Django的Celery做定时任务,再搭配Channels的WebSocket来推送内容。

步骤1:配置Celery定时任务

首先写一个Celery任务,每天读取TXT文件内容,并存入缓存或者数据库,同时触发WebSocket推送:

# your_app/tasks.py
from celery import shared_task
from django.core.cache import cache
from channels.layers import get_channel_layer
from asgiref.sync import async_to_sync
import os
from django.conf import settings

@shared_task
def update_and_push_txt_content():
    # 替换成你的TXT文件实际路径
    txt_file_path = os.path.join(settings.BASE_DIR, 'your_file.txt')
    with open(txt_file_path, 'r', encoding='utf-8') as f:
        content = f.read()
    
    # 把内容存入缓存,方便前端拉取或者后续使用
    cache.set('latest_txt_content', content, timeout=None)
    
    # 通过Channels推送给所有订阅的用户
    channel_layer = get_channel_layer()
    async_to_sync(channel_layer.group_send)(
        'txt_updates_group',
        {
            'type': 'send_txt_content',
            'content': content
        }
    )

然后在Django的settings.py里配置Celery的定时任务,设置每天凌晨执行:

# settings.py
from celery.schedules import crontab

CELERY_BEAT_SCHEDULE = {
    'daily-txt-update-push': {
        'task': 'your_app.tasks.update_and_push_txt_content',
        'schedule': crontab(hour=0, minute=0), # 每天凌晨0点执行
    },
}

步骤2:配置WebSocket前端

前端建立WebSocket连接,接收后端推送的内容并更新页面:

// 建立WebSocket连接,替换成你的Channels路由路径
const wsProtocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
const wsConnection = new WebSocket(`${wsProtocol}//${window.location.host}/ws/txt-updates/`);

// 接收推送的内容
wsConnection.onmessage = function(event) {
    const data = JSON.parse(event.data);
    $('#txt-content').text(data.content);
};

// 处理连接关闭,自动重试
wsConnection.onclose = function() {
    console.log('WebSocket连接断开,5秒后重试');
    setTimeout(() => window.location.reload(), 5000);
};

补充说明

  • 前端轮询的优点是不需要额外配置后端服务,适合快速实现;缺点是如果用户长时间打开页面,可能会有无效请求,或者更新不及时。
  • 后端推送的优点是高效实时,TXT更新后立刻推给用户,没有多余请求;但需要配置Celery和Channels,稍微复杂一点。

你可以根据自己的需求选择合适的方案,先试试前端轮询,要是满足需求就不用折腾后端啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:30:29