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

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

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

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

fast-api后台接口

流式响应

from fastapi.responses import StreamingResponse
from tqdm import tqdm
from pydantic import BaseModelclass ItemDataSingle(BaseModel):data: strasync 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"""# mongodbreturn 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];// 解析 JSONvar 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.lryc.cn/news/485644.html

相关文章:

  • Qt 的 QThread:多线程编程的基础
  • 周末总结(2024/11/16)
  • Chrome和Chromium的区别?浏览器引擎都用的哪些?浏览器引擎的作用?
  • 流程图图解@RequestBody @RequestPart @RequestParam @ModelAttribute
  • AutoUpdater.NET 实现 dotNET应用自动更新
  • 108. UE5 GAS RPG 实现地图名称更新和加载关卡
  • 对称加密与非对称加密:密码学的基石及 RSA 算法详解
  • 排列问题方法总结(递归+迭代)
  • C#从入门到放弃
  • 视频质量评价学习笔记
  • OpenCV、YOLO、VOC、COCO之间的关系和区别
  • Pandas进行周期与时间戳转换
  • 【GPTs】Get Simpsonized:一键变身趣味辛普森角色
  • 概率论公式整理
  • 【C++】—— stack和queue的模拟实现
  • 管家婆工贸ERP BR039.采购订单关联MRP明细表
  • SwanLab安装教程
  • MySQL EXPLAIN,数据库调优的秘密通道
  • 利用redis的key失效监听器KeyExpirationEventMessageListener作任务定时提醒功能
  • 如何基于Tesseract实现图片的文本识别
  • JavaWeb之AJAX
  • 算法---解决“汉诺塔”问题
  • 1-Equity-Transformer:求解NP-Hard Min-Max路由问题的顺序生成算法(AAAI-24)(完)(code)
  • linux001.在Oracle VM VirtualBox中ubuntu虚拟系统扩容
  • RabbitMQ教程:路由(Routing)(四)
  • 华为Ensp模拟器配置RIP路由协议
  • 3. langgraph中的react agent使用 (在react agent添加系统提示)
  • (02)ES6教程——Map、Set、Reflect、Proxy、字符串、数值、对象、数组、函数
  • 【快速解决】kafka崩了,重启之后,想继续消费,怎么做?
  • C++ 的发展