event source backend
# -*- coding: utf-8 -*-
# 这段代码是使用FastAPI框架创建一个简单的服务器端事件(Server-Sent Events,SSE)的示例。以下是对代码的详细解析:
# 1. `import json, random, ...`:这行代码导入了需要的Python模块。
# 2. `event_router = APIRouter()`:这行代码创建了一个新的APIRouter对象,用于定义路由。
# 3. `async def gen(): `:这行代码定义了一个异步生成器函数`gen`。这个函数每次被调用时,都会生成一个新的服务器端事件,事件的数据是一个包含随机整数的JSON对象。
# 4. `yield "event: update
data: " + json.dumps({'counter': random.randint(0, 100)}) + "
"`:这行代码生成了一个新的服务器端事件。事件的类型是`update`,数据是一个包含随机整数的JSON对象。
# 5. `@ event_router.get('/event', summary='视频流', description='视频流')`:这行代码定义了一个新的GET路由`/ event`。这个路由的摘要和描述都是`视频流`。
# 6. `async def get_event(): `:这行代码定义了一个新的异步处理函数`get_event`。这个函数被调用时,会返回一个新的StreamingResponse对象。
# 7. `return StreamingResponse(gen(), media_type='text/event-stream')`:这行代码创建了一个新的StreamingResponse对象。这个对象的内容是`gen`函数生成的服务器端事件,媒体类型是`text/event-stream`。
# 总的来说,这段代码创建了一个简单的服务器端事件(SSE)服务器。当客户端发送GET请求到`/ event`路由时,服务器会返回一个流,这个流的内容是由`gen`函数生成的服务器端事件。每个事件的数据是一个包含随机整数的JSON对象。这是一种常见的使用FastAPI和服务器端事件(SSE)实现实时通信的方法。
import json
import random
from fastapi import APIRouter, Depends, Request, Response, UploadFile
from fastapi.responses import StreamingResponse
event_router = APIRouter()
async def gen():
# 4. `yield "event: update
data: " + json.dumps({'counter': random.randint(0, 100)}) + "
"`:这行代码生成了一个新的服务器端事件。
# 事件的类型是`update`,数据是一个包含随机整数的JSON对象。
yield "event: update
data: " + json.dumps({'counter': random.randint(0, 100)}) + "
"
@event_router.get('/', summary='event', description='event')
async def get_event():
return StreamingResponse(gen(), media_type='text/event-stream')
frontend
export function setupCounter(element: HTMLButtonElement) {
let counter = 0;
const setCounter = (count: number) => {
counter = count;
element.innerHTML = `count is ${counter}`;
};
setCounter(0);
const eventSource = new EventSource("http://127.0.0.1:8000/v1/event/");
eventSource.addEventListener("update", (event) => {
// console.log(event.data);
const data = JSON.parse(event.data);
// do something with data
setCounter(data.counter);
});
// close event source
element.addEventListener("click", () => eventSource.close());
}
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...