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

网站建设 客户同程国内新闻最新消息今天简短

网站建设 客户同程,国内新闻最新消息今天简短,国际进出口贸易公司名字,如何做网站路径分析介绍 SSE(Server-Sent Events)是一种 服务器主动向客户端“推送”数据的技术,特别适合用来实现像 GPT 这种「流式输出」的效果。 SSE 是一种基于 HTTP 的单向通信协议: • 客户端(浏览器)发起请求后 •…

介绍

SSE(Server-Sent Events)是一种 服务器主动向客户端“推送”数据的技术,特别适合用来实现像 GPT 这种「流式输出」的效果。

SSE 是一种基于 HTTP 的单向通信协议

• 客户端(浏览器)发起请求后

• 服务器可以不断「推送消息」给客户端

• 使用 MIME 类型:text/event-stream

• 天然支持断线重连(Last-Event-ID)

用途

•	🌊 流式响应(比如 GPT、AI 对话)
•	📢 实时通知 / 消息广播
•	📈 实时数据更新(股票、仪表盘)
•	🧠 AI 推理过程展示

服务端:

用两个换行分割
data: 这是第一条消息data: 这是第二条消息data: {"event": "update", "msg": "更新成功"}

实现

使用fastapi 非常容易实现

定义一个接口,在这个接口定义一个async 异步方法,这个方法使用yield 生产对应的信息。

使用StreamingResponse 来对这个方法进行生产捕获

from fastapi import FastAPI,Request
from fastapi.responses import StreamingResponse
from services.async_openai_out import async_openai_out
import asyncio
app = FastAPI()@app.post('/sse/v1')
async def root(request: Request):async def event_stream():for i in range(10):yield f"data: {i}\n\n"await asyncio.sleep(0.1)# 用了 Python 的参数顺序机制,你看到的 content 参数确实就是你传入的 event_stream()。r = StreamingResponse(event_stream(), media_type="text/event-stream")return r

这个StreamingResponse 是一个异步响应类,支持将内容「一块一块」地异步地发送给客户端,而不是像普通 Response 一次性构造整个响应体。

•	发送响应时,Starlette 会通过 __call__ 调用 stream_response 方法,将响应体通过 await send() 一块块地推送给客户端。
•	你传入的 AsyncGenerator 会成为 body_iterator。

ContentStream = typing.Union[AsyncContentStream, SyncContentStream]
class StreamingResponse(Response):body_iterator: AsyncContentStreamdef __init__(self,content: ContentStream,status_code: int = 200,headers: typing.Mapping[str, str] | None = None,media_type: str | None = None,background: BackgroundTask | None = None,) -> None:•	AsyncContentStream: 异步生成器、异步迭代器(如 async def event_stream(): yield ...)•	SyncContentStream: 同步的可迭代对象(如 def gen(): yield ...

这个SSE的curl 和普通的post一样:

curl --location --request POST 'http://localhost:8000/sse/v1' \
--header 'User-Agent: Apifox/1.0.0 (https://apifox.com)' \
--header 'Accept: */*' \
--header 'Host: localhost:8000' \
--header 'Connection: keep-alive'

不过返回的响应头里面:

date	Sat, 22 Mar 2025 07:29:57 GMT
server	uvicorn
content-type	text/event-stream; charset=utf-8
Transfer-Encoding	chunked

FastAPI 会根据 返回值的类型自动推断并构造响应对象,这是因为 FastAPI 的底层用了 Pydantic + Starlette 自动序列化机制。

普通的post 响应请求:

@app.post('/sse/no_sse')
async def root(request: Request):r = {"message": "Hello World"} # 也可以直接返回return rreturn Response(content=json.dumps(r), media_type="application/json")from fastapi.responses import JSONResponse@app.post("/sse/no_sse")
async def root():return JSONResponse(content={"message": "Hello World"})

封装为openai使用的sse:

注意这个 yield f’data: {chunk}\n\n’ 少不了

@app.post("/sse/async_openai_out")
async def root(request: Request):user_message = "你好"async def gpt_stream():async for chunk in async_openai_out.gpt_stream(user_message=user_message,system_prompt="You are a helpful assistant."):print(chunk)yield f'data: {chunk}\n\n'r = StreamingResponse(gpt_stream(), media_type="text/event-stream")return r

一些思考

  • StreamingResponse 内部是如何 send() 的?

    FastAPI 的 StreamingResponse 继承自 Starlette 的 Response,其关键机制是异步迭代器(AsyncIterable)。核心在 call() 中调用了:

async def stream_response(self, send):async for chunk in self.body_iterator:await send({"type": "http.response.body","body": chunk,"more_body": True})
  • 为什么 text/event-stream 是长连接 + 推送?

    HTTP 长连接:

    • SSE 使用的是 HTTP/1.1 长连接,不会在发送完一条消息后断开。

    • 响应头 Content-Type: text/event-stream 告诉浏览器或客户端:“我会不断推送数据”。

    1. 服务端推送格式:

    • 每条消息格式是:data: xxxx\n\n

http://www.dtcms.com/wzjs/257916.html

相关文章:

  • 网页美工设计photoshop 规划教材长沙做优化的公司
  • 网站建设 有聊天工具的吗网站维护的内容有哪些
  • 网站建设 无锡网络软文写作
  • 南阳做网站哪家好酒店如何进行网络营销
  • 淘宝移动网站建设网络营销的主要手段
  • 聊城做网站推广费用推广竞价的公司有哪些
  • 做兽药网站用什么图片好搜索关键词推荐
  • 宝安网站制作公司怎么在百度上做广告推广
  • 河南省建设厅官方网站郭风春厦门网络推广
  • 合网站 - 百度一个新产品怎么推广
  • 宣传推广计划谷歌seo
  • WordPress上展示PDF武汉seo培训
  • 哪些网站做外贸效果好深圳英文网站推广
  • 做网站怎么写工作日志2021年网络热点舆论
  • 天津低价做网站最全的百度网盘搜索引擎
  • 信阳建设企业网站公司什么是信息流广告
  • 东莞的网站建设宁波正规seo推广公司
  • 小蘑菇网站建设下载seo排名优化怎样
  • 杨浦集团网站建设seo工具不包括
  • 网站建设要咨询哪些内容网络广告怎么做
  • 做网站是怎么赢利的百度竞价入门教程
  • 自贡做网站公司做网店自己怎么去推广
  • 微信3g网站模板青岛网络seo公司
  • 网站制作费百度推广公司电话
  • 做外发的网站视频推广
  • 苏迪曼杯d组:日本韩国出线南京百度推广优化
  • 临沂建设局官方网站公司市场营销策划方案
  • 网上做服装批发网站怎么做网络推广优化
  • app公司管理湖北seo推广
  • 微信链接的微网站怎么做的怎么自己注册网站平台了