FastAPI 教程

4.5 流式响应与 StreamingResponse

FastAPI 流式响应入门教程:Python 初学者学习 StreamingResponse

FastAPI 教程

专为Python初学者设计的FastAPI流式响应教程,通过生活化类比和简单动手示例,快速掌握如何创建实时API响应,建立Web开发信心。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

FastAPI 流式响应入门教程:从零开始学习 StreamingResponse

欢迎来到FastAPI的世界!如果你有Python基础,但没做过Web开发,别担心,本教程会像学做一道新菜一样,带你一步步上手。今天,我们重点学习流式响应(StreamingResponse),这就像是水管里的水,而不是一次性倒满杯子的水。准备好了吗?让我们开始吧!

1. 准备你的厨房:安装必备工具

首先,确保你有Python(建议3.7+)。然后,用pip安装FastAPI和uvicorn(一个服务器)。打开终端或命令提示符,运行:

pip install fastapi uvicorn

这就好比买了厨具,一切准备就绪!

2. 什么是流式响应?一个生活化类比

想象一下:

  • 普通响应:就像用一个大水桶装水,一次装满所有数据再返回。适合小数据,但如果数据太大或需要实时更新,就会很慢。
  • 流式响应:就像一根水管,水一点点流出,可以持续传输数据。适合实时数据(如股票价格)或大文件(如视频流)。

在FastAPI中,StreamingResponse 就是一个这样的水管,让你一次返回一点数据,而不是等到所有数据都准备好。

3. 你的第一个流式API:送上一串祝福

让我们创建一个简单的FastAPI应用,返回一个逐步发送的消息流。这就像在水管中一点一点地流出祝福的话语。

步骤1:创建Python文件

新建一个文件,比如 streaming_demo.py,并输入以下代码:

from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import time

# 创建FastAPI应用
app = FastAPI()

# 定义一个生成器函数,模拟流式数据
def message_stream():
    messages = ["你好!", "欢迎来到FastAPI教程。", "这是流式响应示例。", "再见!"]
    for message in messages:
        yield f"{message}\n"  # 每次yield一小段数据
        time.sleep(1)  # 模拟延迟,让输出更清晰

@app.get("/stream")
async def stream_messages():
    """
    流式端点:返回一个实时消息流
    """
    return StreamingResponse(message_stream(), media_type="text/plain")

# 要运行,在终端输入:uvicorn streaming_demo:app --reload

步骤2:运行并查看结果

在终端中,进入文件所在目录,运行:

uvicorn streaming_demo:app --reload

然后,打开浏览器访问 http://127.0.0.1:8000/stream。你会看到消息一个一个地出现,每秒钟一条,就像水流一样!这就是你的第一个“成功时刻”——你已经创建了一个流式API!

4. 深入StreamingResponse:更多示例

现在,我们来玩点更酷的。FastAPI的StreamingResponse可以处理各种数据类型。

示例1:流式JSON响应

假设我们要实时发送一个数字序列,比如1到10,每个数字作为一个JSON对象。修改代码:

from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import json
import time

app = FastAPI()

def number_stream():
    for i in range(1, 11):
        yield json.dumps({"number": i}) + "\n"  # 将数据转为JSON格式
        time.sleep(0.5)

@app.get("/numbers")
async def stream_numbers():
    return StreamingResponse(number_stream(), media_type="application/json")

运行后访问 http://127.0.0.1:8000/numbers,你会看到数字一个接一个地输出在JSON格式中。试试看!

示例2:模拟实时数据流(比如传感器读数)

让我们模拟一个温度传感器,每隔2秒发送一次温度数据。这是一个更贴近生活的例子。

import random

def sensor_stream():
    while True:  # 无限循环,模拟持续数据流
        temperature = random.uniform(20.0, 30.0)  # 生成随机温度
        yield f"温度: {temperature:.2f}°C\n"
        time.sleep(2)

@app.get("/sensor")
async def stream_sensor():
    return StreamingResponse(sensor_stream(), media_type="text/plain")

访问 http://127.0.0.1:8000/sensor,你会看到温度数据不断更新。这就是流式响应的魅力——可以实时推送数据!

5. 实践挑战:自己动手,丰衣足食

现在轮到你试试了!创建一个新端点,比如 /greetings,让它流式返回你的名字和一条欢迎消息,每次延迟1秒。代码提示:

  • 定义一个生成器函数,yield出字符串。
  • 使用 StreamingResponse 返回。

完成后,运行应用并访问这个端点,享受自己创造的“成功时刻”!

6. 总结与下一步

恭喜!你已经学会了如何在FastAPI中使用StreamingResponse来创建流式响应。记住:

  • 流式响应适合处理实时或大量数据。
  • StreamingResponse 是FastAPI提供的一个方便工具,可以返回任何可迭代的数据流。
  • 通过动手实践,你已经建立了信心,可以进一步探索FastAPI的其他功能,比如文件上传、WebSocket等。

继续学习,快速API开发之路还很长。推荐查看FastAPI官方文档,那里有更多高级示例。祝你编码愉快!

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包