FastAPI实现event-stream响应式流式输出

本文介绍了如何在FastAPI应用中创建一个实时事件流,通过`event_generator`函数生成文本消息并以`text/event-stream`媒体类型返回给请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import io

from fastapi import FastAPI, Query, Path
from fastapi.responses import StreamingResponse
import uvicorn
from pydantic import BaseModel
from typing import Optional
from starlette.templating import Jinja2Templates
from starlette.requests import Request
from starlette.responses import HTMLResponse
import asyncio

app = FastAPI()
templates = Jinja2Templates(directory="../templates")


@app.get("/stream")
async def root(request: Request):
    async def event_generator(request: Request):
        res_str = "双天至尊真是一部好的电视剧!!!"
        for i in res_str:
            if await request.is_disconnected():
                print("连接已中断")
                break
            data = f'&
C语言本身并不直接支持`text/event-stream`这样的HTTP响应格,因为这通常是用于Web实时应用程序(如WebSocket)的服务器端处理。然而,如果你想要在C语言环境中处理这种流式数据,你可以选择使用一些库或者第三方组件,它们可能会提供事件驱动的IO模型来帮助解析。 例如,使用`libcurl`库可以方便地发送HTTP请求并接收响应。对于`text/event-stream`格,你需要解析接收到的HTTP头信息,识别Content-Type字段是否包含`text/event-stream`,然后逐行读取数据,每行代表一个事件。 以下是一个简单的示例,展示如何使用`libcurl`处理`text/event-stream`数据: ```c #include <curl/curl.h> // ... CURL *curl; CURLcode res; // 初始化CURL curl_global_init(CURL_GLOBAL_DEFAULT); // 创建CURL会话 curl = curl_easy_init(); if(curl) { // 设置请求的URL curl_easy_setopt(curl, CURLOPT_URL, "your_url"); // 检查是否启用事件流处理 if(curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, event_stream_write_callback) == CURLE_OK) { struct WriteData data; data.buffer = malloc(BUFFER_SIZE); // 定义缓冲区 data.offset = 0; // 初始化偏移量 // 连接到服务器并开始接收数据 res = curl_easy_perform(curl); if(res != CURLE_OK) fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); // 清理资源 free(data.buffer); curl_easy_cleanup(curl); } curl_global_cleanup(); // 关闭全局CURL上下文 } void event_stream_write_callback(char *data, size_t size, CURL *handle, void *userp) { WriteData *write_data = (WriteData *)userp; char *new_buffer = realloc(write_data->buffer, write_data->offset + size + 1); // 扩展缓冲区 if (!new_buffer) { perror("realloc"); return; } memcpy(new_buffer + write_data->offset, data, size); new_buffer[write_data->offset + size] = '\0'; // 添加新行结束符 write_data->offset += size; process_event(new_buffer); // 根据需要解析并处理每个事件 } ``` 这里假设你有一个`process_event`函数来处理每个独立的事件。请注意,实际应用中,你还需要处理错误情况、关闭连接等细节。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AIOTASMCPA2A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值