当前位置: 首页 > article >正文

fast-api后端 + fetch 前端流式文字响应

fast-api后端 + fetch 前端流式文字响应

  • fast-api后台接口
    • 流式响应
  • 前端
    • fetch 流式文本数据处理

fast-api后台接口

流式响应

from fastapi.responses import StreamingResponse
from tqdm import tqdm
from pydantic import BaseModel

class ItemDataSingle(BaseModel):
    data: str


async def responce_text_streammer(data):   
	_data = data.data
	# 假设你发送过来的
	data = json.loads(_data)
    for dat in tqdm(data):
       dat = your_worker_function(dat)
       # 给每条数据一个分割标识
       yield json.dumps(dat,ensure_ascii=False) + "@@+" 


@app.post("/batchtext2furniture")
async def batchtext2furniture(data: ItemDataSingle,):
    """
    :arg
    
    """
    # mongodb
    return StreamingResponse(responce_text_streammer(data))

前端

fetch 流式文本数据处理

var req_data = {
        data: JSON.stringify({}),//youdata
      };
let charsReceived = 0;
const startTime = Date.now();
let result = "";
let num_results = 0;
const decoder = new TextDecoder("utf-8");
fetch("/batchtext2furniture", {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: req_data,
        stream: true,
      })
        .then((response) => {
          const reader = response.body.getReader();
          return new ReadableStream({
            async start(controller) {
              let resev_s = true;
              while (resev_s) {
                const { done, value } = await reader.read();
                if (done) {
                  controller.close();
                  resev_s = false;

                  break;
                }
                charsReceived += value.length;
                const chunk = value;
                result += decoder.decode(chunk);
                console.log("Received " + charsReceived + " characters");
                const responseTime = (Date.now() - startTime) / 1000;
                num_results += 1;
                if (result.endsWith("@@+")) {
                  console.log("接收到分割符号");
                  let parts = result.split("@@+");
                  let lastPart = parts[parts.length - 2];
                  // 解析 JSON
                  var json_data = JSON.parse(lastPart);
                  // 前端具体对每段数据的处理
                  // ......

                } else {
                  console.log("not endswith @@+");
                }
                console.log("数据赋值完成" );
                controller.enqueue(value);
              }
            },
          });
        })
        .then((stream) => {
          console.log(stream);
          console.log(stream, "stream");
          console.log(stream.size);
        })
        .catch((error) => {
          console.error("Error:", error);
        })
        .finally(() => {
          yourfinallyworker();
        });
      const endTime = Date.now();
      console.log(endTime - startTime, "搜索时间");
    }

http://www.kler.cn/a/396556.html

相关文章:

  • Ubuntu中使用纯命令行进行Android开发
  • # 第20章 Cortex-M4-触摸屏
  • 动力商城-03 Idea集成apifox Mybatis-Plus字段策略
  • 『VUE』27. 透传属性与inheritAttrs(详细图文注释)
  • 【Java基础知识系列】之Java类的初始化顺序
  • LeetCode654.最大二叉树
  • Spring Cloud 使用 Nacos 注册中心
  • 从基础到进阶,Dockerfile 如何使用环境变量
  • stm32在linux环境下的开发与调试
  • nacos-operator在k8s集群上部署nacos-server2.4.3版本踩坑实录
  • 数据结构 -- 二叉搜索树
  • 十一:HTTP 状态码详解:解读每一个响应背后的意义
  • 【论文复现】图像风格迁移技术
  • 新手教学系列——善用 VSCode 工作区,让开发更高效
  • 自定义实体类中DateTime属性的序列化格式
  • CSP-X2024山东小学组T2:消灭怪兽
  • IO流实用案例:用字节流--输入流(Inpustream)、输出流(OutputStream)写一个拷贝图片的案例--超简单!
  • Oracle故障处理:ora-12514 与 ora-28547
  • npm install命令报错:npm ERR Could not resolve dependency npm ERR peer…
  • Springboot RabbitMq 集成分布式事务问题
  • SQL,力扣题目1194,锦标赛优胜者
  • Java学习Day60:回家!(ElasticStatic)
  • 《Probing the 3D Awareness of Visual Foundation Models》论文解析——多视图一致性
  • 【WPF】Prism库学习(一)
  • Go语言的零值可用性:优势与限制
  • 微服务即时通讯系统的实现(客户端)----(1)