Python使用fastAPI实现一个流式传输接口

1. 使用fastapi实现流式传输

1.1 服务端 fastapi_server.py

编写服务端代码fastapi_server.py。服务端代码主要使用了fastapi和uvicorn两个库。

#!/usr/bin/env python
# coding=utf-8
# @Time    : 2024/1/31 19:13
# @Software: PyCharm
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import time
import uvicornapp = FastAPI()async def generate_data():for i in range(1, 11):time.sleep(1)  # 模拟每秒生成一个块的耗时操作yield f"FASTAPI Chunk {i}\n"@app.get("/stream")
async def stream_data():return StreamingResponse(generate_data(), media_type="text/plain")if __name__ == "__main__":uvicorn.run(app, host="127.0.0.1", port=8001)

1.2客户端 (requests)

使用python编写一个客户端stream_client.py,进行流式接收。

#!/usr/bin/env python
# coding=utf-8
# @Time    : 2024/1/31 19:14
#
# stream_client.pyimport requestsurl = "http://127.0.0.1:8001/stream/"  # 替换为你的实际接口地址def test1():try:response = requests.get(url, stream=True) # stream参数为Trueif response.status_code == 200:for chunk in response.iter_content(chunk_size=7):  # 这行很重要哦if chunk:print(chunk.decode("utf-8"), end="")except requests.RequestException as e:print(f"Request failed: {e}")def test2():try:response = requests.get(url, stream=True)if response.status_code == 200:for line in response.iter_lines(decode_unicode=True, chunk_size=8):if line:print("Received SSE event:", line)except requests.RequestException as e:print(f"Request failed: {e}")# test1()
test2()

1.3 在html中流式显示

新建一个client.html文件,放在fastapi_server.py目录下。同时修改fastapi_server.py, 增加一个BlockIterator迭代器对长文本进行切块。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Streaming Client (client.html)</title>
</head>
<body>
aaa
<div id="output"></div><script>const outputDiv = document.getElementById('output');// 替换为你的实际接口地址const url = '$FASTAPI$';// 使用 Fetch API 发送请求fetch(url).then(response => {const reader = response.body.getReader();return new ReadableStream({async start(controller) {while (true) {const { done, value } = await reader.read();// 如果读取完毕,中止流if (done) {controller.close();break;}// 将每个块的内容添加到页面上outputDiv.innerHTML += new TextDecoder().decode(value) +"<br>";}}});}).then(stream => {// 使用 TextStream,将流连接到页面上的输出const textStream = new TextStream(stream);return textStream.pipeTo(new WritableStream({write: chunk => {// 在这里你可以处理每个块的数据console.log('Received chunk:', chunk);}}));}).catch(error => console.error('Error:', error));
</script></body>
</html>

服务端增加一个/web_client接口,读取上述网页内容

#!/usr/bin/env python
# coding=utf-8
# @Time    : 2024/1/31 19:13
# @Software: PyCharm
from fastapi import FastAPI
from starlette.responses import HTMLResponse
from fastapi.responses import StreamingResponse
import time
import uvicornapp = FastAPI()CONTENT = """《易经》被誉为诸经之首,大道之源,是中华优秀传统文化的总纲领,是中华民族五千年智慧的结晶。他含盖万有、纲纪群伦,是中华文化的杰出代表;他博大精微、包罗万象,亦是中华文明的源头。其内容涉及哲学、生命、自然、科学、政治、天文、地理、文学、艺术等诸多领域,是各家共同的经典。
《易经》包括《连山》《归藏》《周易》三部易书,现存于世的只有《周易》。《周易》相传是周文王被囚羑里时,研究《易经》所作的结论。"""class BlockIterator:def __init__(self, text, block_size=10):self.text = textself.block_size = block_sizeself.index = 0def __iter__(self):return selfdef __next__(self):if self.index >= len(self.text):raise StopIterationblock = self.text[self.index:self.index + self.block_size]self.index += self.block_sizereturn blockasync def generate_data():for i in BlockIterator(CONTENT, block_size=1):time.sleep(0.05)  # 模拟每秒生成一个块的耗时操作# yield f"FASTAPI Chunk {i}\n"yield i@app.get("/web_client", response_class=HTMLResponse)
async def read_root():with open("static/client.html", "r") as file:html_content = file.read()html_content = html_content.replace("$FASTAPI$", "http://127.0.0.1:8001/stream/")return HTMLResponse(content=html_content)@app.get("/stream")
async def stream_data():return StreamingResponse(generate_data(), media_type="text/plain")if __name__ == "__main__":uvicorn.run(app, host="127.0.0.1", port=8001)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/447948.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaScript】var,let 和 const 的区别

先看一些前置知识&#xff1a; 此时输出 undefined。 全局作用域&#xff1a;全局都可以访问。函数作用域&#xff1a;只有函数内部可以访问。块级作用域&#xff1a;let 和 const 只能在块级作用域&#xff08;一对大括号包裹的代码片段&#xff09;中访问。let 和 const 在变…

怎么把图片的二维码提取出来?免费在线二维码转换成链接的方法

在部分情况下无法直接使用二维码展示内容&#xff0c;那么可以将二维码分解成链接后来使用&#xff0c;点击链接就可以跳转二维码的页面内容&#xff0c;这种方式可以在电脑或者手机上预览二维码内容。怎么提取二维码链接呢&#xff1f;下面小编来教大家二维码解码器的使用方法…

单机搭建hadoop环境(包括hdfs、yarn、hive)

单机可以搭建伪分布式hadoop环境&#xff0c;用来测试和开发使用&#xff0c;hadoop包括&#xff1a; hdfs服务器 yarn服务器&#xff0c;yarn的前提是hdfs服务器&#xff0c; 在前面两个的基础上&#xff0c;课可以搭建hive服务器&#xff0c;不过hive不属于hadoop的必须部…

Linux自动创建本地yum源与清华大学源仓库

Linux自动创建本地yum源与清华大学源仓库 系统环境&#xff1a; Server1&#xff1a;172.20.26.167—CentOS7.6 在172.20.26.167服务器上 yum install yum-utils -y 输入yum按两下tab键&#xff0c;可以看到 yum-config-manager 工具&#xff0c;使用该工具可以自动配置仓…

【正点原子STM32连载】第四十六章 SD卡实验 摘自【正点原子】APM32E103最小系统板使用指南

1&#xff09;实验平台&#xff1a;正点原子APM32E103最小系统板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第四…

异步编程,到底有什么用?

关键词&#xff1a;高性能、架构设计、异步思想、场景落地 文章导读 场景切入 先来看一个日常生活快递寄件场景&#xff0c;从寄件人&#xff08;寄件&#xff09;到收件人&#xff08;收件&#xff09;&#xff0c;全流程如下 当你准备寄送一个包裹时&#xff0c;通常你可以…

Qt|制作简单的不规则窗体

通常我们用到的对话框基本上都是规则的&#xff0c;在有些特殊情况下&#xff0c;也会使用到不规则窗口&#xff0c;那么该如何实现不规则窗体呢&#xff1f; 在MFC框架下很难实现&#xff0c;应该说是难的都想放弃&#xff0c;但是&#xff0c;Qt框架下提供了一个叫做setMask…

Python+PyQt5+C Hw信息检测

UI主界面&#xff1a; C源代码&#xff1a; /* I/O port access* Copyright (C) 2009 Red Hat Inc.** This program is free software; you can redistribute it and/or modify* it under the terms of the GNU General Public License as published by* the Free Software Fo…

kingbase控制文件重建

背景&#xff1a; 测试版本&#xff1a;V008R006C005B0023 sys_control文件在数据目录的global下 若sys_control文件损坏或被删&#xff0c;会导致库无法启动 处理方式&#xff1a; 所在目录为数据目录 1、尝试dryrun touch global/sys_control sys_resetwal -l 00000001…

用Audio2Face导出Unity面部动画

开始之前说句话&#xff0c;新年前最后一篇文章了 一定别轻易保存任何内容&#xff0c;尤其是程序员不要轻易Ctrl S 在A2F去往Unity的路上&#xff0c;还要经历特殊Blender&#xff0c;自己电脑中已下载好的可能不是很好使。 如果想查看UE相关的可以跳转到下边这两篇链接 1. …

2024年第九届信号与图像处理国际会议(ICSIP 2024)

2024第九届信号与图像处理国际会议&#xff08;ICSIP 2024&#xff09;将于2024年7月12-14日在中国南京召开。ICSIP每年召开一次&#xff0c;在过去的七年中吸引了1200多名与会者&#xff0c;是展示信号和图像处理领域最新进展的领先国际会议之一。本次将汇集来自亚太国家、北美…

#10外部网页跳转vue3+SpringMVC解码GBK编码的参数

目录 1、背景 2、失败尝试之iconv-lite 2.1、安装和使用 2.2、遇到的问题 2.3、解决方案(vite-plugin-node-polyfills) 2.4、测试 3、成功尝试 3.1、前端参数读取方式 3.2、后端解码 1、背景 外部jsp页面中编码方式为GBK&#xff0c;跳转到vue页面时如果使用decodeURI…