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

基于Flask的ML应用遇CloudFlare网关超时,寻求预测时渲染内容的方法

解决Flask ML应用CloudFlare超时问题的可行方案

方案一:异步任务队列+前端轮询

把模型预测任务放到异步队列中,避免请求长时间阻塞,从根源上规避超时:

  • 后端搭建任务队列:用Celery配合Redis或RabbitMQ作为消息中间件,将预测任务异步执行
  • 接口拆分:
    1. 提交任务接口:接收用户请求后,创建异步任务并返回任务ID
    2. 查询任务状态接口:根据任务ID返回当前任务的执行状态(等待中/执行中/完成)和结果
  • 前端逻辑:拿到任务ID后,每隔几秒轮询状态接口,直到任务完成后渲染结果

示例代码片段:

# Celery配置
from celery import Celery

celery = Celery('tasks', broker='redis://localhost:6379/0')

@celery.task
def run_ml_prediction(input_data):
    # 这里是你的模型预测逻辑,耗时150秒
    result = your_model.predict(input_data)
    return result

# Flask接口
from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route('/submit-prediction', methods=['POST'])
def submit_prediction():
    input_data = request.json.get('data')
    task = run_ml_prediction.delay(input_data)
    return jsonify({'task_id': task.id})

@app.route('/check-task/<task_id>')
def check_task(task_id):
    task = run_ml_prediction.AsyncResult(task_id)
    if task.state == 'PENDING':
        return jsonify({'status': '等待中'})
    elif task.state == 'SUCCESS':
        return jsonify({'status': '完成', 'result': task.result})
    else:
        return jsonify({'status': '执行中'})

方案二:流式响应(Server-Sent Events)

利用Flask的流式响应能力,在预测过程中持续返回内容,保持连接活跃,避免CloudFlare判定超时:

  • 后端用stream_with_context生成流式响应,在预测的关键节点返回进度信息
  • 前端用EventSource接收流式消息,实时渲染加载状态或进度

示例代码片段:

from flask import Flask, request, Response, stream_with_context
import time

app = Flask(__name__)

def prediction_stream(input_data):
    # 先返回初始加载提示
    yield "data: 正在初始化模型...\n\n"
    time.sleep(2)
    
    # 模拟预测过程中的进度更新
    for i in range(10):
        progress = (i+1)*10
        yield f"data: 预测进度 {progress}%\n\n"
        time.sleep(15)  # 对应实际预测的阶段耗时
    
    # 执行预测并返回结果
    result = your_model.predict(input_data)
    yield f"data: 完成!结果:{result}\n\n"

@app.route('/predict', methods=['POST'])
def predict():
    input_data = request.json.get('data')
    return Response(stream_with_context(prediction_stream(input_data)),
                    mimetype='text/event-stream')

前端可以这样处理:

const eventSource = new EventSource('/predict');
eventSource.onmessage = function(event) {
    // 实时更新页面内容
    document.getElementById('status').textContent = event.data;
    if (event.data.includes('完成')) {
        eventSource.close();
    }
};

方案三:调整CloudFlare超时设置(补充方案)

如果使用CloudFlare付费套餐,可以在控制台调整网关超时时间:

  • 进入CloudFlare仪表盘 → 对应域名 → 「规则」→ 「页面规则」
  • 添加规则,设置「超时」选项,最大可调整至150秒(部分套餐支持更长时间)
  • 注意:免费版CloudFlare的超时限制为100秒,无法调整,此方案仅适用于付费用户

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 10:55:24