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

Flask中如何正确返回格式化后的timedelta时间字符串至前端

问题解决方法

错误原因

报错TypeError: unsupported type for timedelta seconds component: str的核心原因是:你调用datetime.timedelta(seconds=average)时,average已经是字符串类型,但timedelta的seconds参数要求传入整数或浮点数,类型不匹配导致报错。

大概率是你格式化后把字符串赋值回了average变量,后续循环或代码中又重复用这个字符串调用timedelta,引发类型污染。

解决方案

1. 保留原始数值,单独存储格式化结果

不要覆盖原始的average数值变量,用新变量存储格式化后的字符串,确保传给timedelta的始终是数值类型。

示例代码:

from datetime import timedelta
import time
from flask import Flask, Response, jsonify

app = Flask(__name__)

@app.route('/update')
def update():
    def data_generator():
        while True:
            # 示例total计算逻辑,替换为你的实际代码
            total = 100
            # 保留原始的average数值(基于time.time的float类型)
            raw_average = time.time() % 3600  # 取小时内的秒数,避免超过1小时显示多余位数
            # 单独生成格式化字符串,不修改原始数值
            formatted_average = str(timedelta(seconds=raw_average))[2:7]
            # 以SSE格式返回数据(适配前端定时请求),普通接口可直接return jsonify
            yield f"data: {jsonify({'total': total, 'average': formatted_average}).data.decode('utf-8')}\n\n"
            time.sleep(1)
    return Response(data_generator(), mimetype='text/event-stream')

2. 避免循环中变量类型污染

如果生成器是循环运行的,确保每次循环中,timedelta(seconds=...)接收的都是新计算的数值,而非上一次循环中已转成字符串的变量。

前端适配示例

如果后端用SSE返回数据,前端jQuery处理代码:

var source = new EventSource('/update');
source.onmessage = function(event) {
    var data = JSON.parse(event.data);
    // 渲染到页面对应元素
    $('#total').text(data.total);
    $('#average').text(data.average);
};

如果是普通定时AJAX请求:

setInterval(function() {
    $.get('/update', function(data) {
        $('#total').text(data.total);
        $('#average').text(data.average);
    });
}, 1000);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:54:26