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

Django中如何通过Python函数实时更新HTML文本框作为处理日志

实现Django数据处理进度实时显示到前端文本框

作为新手,你遇到的核心问题是Django默认是同步请求-响应模式——一旦视图函数返回render,这个请求就结束了,没法再主动给前端发消息更新内容。要实现实时日志更新,我们可以用「前端轮询后端拿日志」的方式,配合后台线程处理数据,一步步来很简单:

步骤1:重构数据处理逻辑,把日志存在Session里

首先把你的数据处理代码抽成单独的函数,处理过程中把日志写到用户的Session里(每个用户的Session是独立的,不会互相干扰):

import threading
from django.shortcuts import render, JsonResponse

# 单独的数据处理函数,在后台线程运行
def process_data(input_lot, user_session):
    # 初始化日志列表
    user_session['processing_log'] = []
    user_session.save()  # 手动保存Session,线程内修改必须加这步

    # 记录启动状态
    user_session['processing_log'].append("✅ 数据处理已启动,正在读取机器信息...")
    user_session.save()

    # 执行你的核心处理逻辑
    machines = lt.trace_machine(input_lot)
    user_session['processing_log'].append(f"✅ 已完成机器追踪,共找到 {len(machines)} 台机器")
    user_session.save()

    # 可添加更多处理步骤和日志
    user_session['processing_log'].append("🎉 数据处理全部完成!")
    user_session.save()

# 原有的结果页面视图
def query_result(request, job_id):
    info_dict = request.session['info_dict']
    input_lot = inputFile.LOT.tolist()  # 注意inputFile需确保可正常获取,比如从info_dict中提取

    # 启动后台线程处理数据,不阻塞页面返回
    processing_thread = threading.Thread(
        target=process_data,
        args=(input_lot, request.session)
    )
    processing_thread.daemon = True  # 线程随主进程结束而结束
    processing_thread.start()

    # 立刻返回结果页面,用户能看到页面同时后台在处理
    return render(request, 'tools/result.html', {'job_id': job_id})

# 新增视图,用于给前端返回最新日志
def get_processing_log(request):
    # 从Session拿日志,无日志则返回空列表
    current_log = request.session.get('processing_log', [])
    return JsonResponse({'log': current_log})

步骤2:配置URL路由

在你的urls.py里新增获取日志的路由:

from django.urls import path
from . import views

urlpatterns = [
    path('result/<int:job_id>/', views.query_result, name='query_result'),
    # 新增日志接口路由
    path('tools/get-processing-log/', views.get_processing_log, name='get_processing_log'),
    # 其他路由...
]

步骤3:前端用JavaScript定时更新文本框

在result.html里添加文本框和定时请求日志的脚本:

<!-- 只读文本框显示日志,用等宽字体更易读 -->
<textarea id="processing-log" rows="12" cols="90" readonly style="font-family: monospace;"></textarea>

<script>
// 请求后端获取最新日志
function updateProcessingLog() {
    fetch('/tools/get-processing-log/')
        .then(response => response.json())
        .then(data => {
            const logBox = document.getElementById('processing-log');
            // 把日志数组转成每行一条的文本
            logBox.value = data.log.join('\n');
            // 自动滚动到底部,显示最新日志
            logBox.scrollTop = logBox.scrollHeight;
        })
        .catch(err => console.log('获取日志出错:', err));
}

// 页面加载后立刻执行一次,之后每2秒更新一次
updateProcessingLog();
setInterval(updateProcessingLog, 2000);
</script>

新手注意事项

  1. Session保存问题:线程里修改Session后必须调用user_session.save(),否则日志不会被持久化,前端拿不到更新。
  2. 线程安全性:这种简单线程方式适合小流量场景,如果是高并发网站,建议用专业的后台任务队列(比如Celery+Redis),但对你当前需求来说,线程足够用了。
  3. 日志清理:处理完成后可以在process_data最后加del user_session['processing_log'],避免Session里留存旧日志。

这样用户打开页面后,就能看到文本框里实时更新处理进度,清楚知道网站在正常运行啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:06:59