FastAPI教程:快速构建高性能API
FastAPI教程:快速构建高性能API
介绍
FastAPI是一个现代的、快速的(高性能)Web框架,用于构建APIs,基于标准的Python类型提示。它非常适合用于构建高效、易于维护的API服务。FastAPI支持自动生成文档,输入数据验证和异步编程,且性能接近Go和Node.js。
本教程目标
本教程将带领你构建一个简单的FastAPI应用,包括:
1. 创建FastAPI项目
2. 定义和处理API端点
3. 输入数据验证与自动文档
4. 异步支持
5. 部署FastAPI应用
环境准备
安装FastAPI与Uvicorn
在开始之前,我们需要安装FastAPI和Uvicorn。Uvicorn是一个ASGI服务器,通常与FastAPI一起使用,提供高性能的异步Web服务。
pip install fastapi uvicorn
目录结构
我们建议的项目目录结构如下:
/fastapi-example
├── app/
│ ├── main.py
│ ├── models.py
│ └── schemas.py
├── requirements.txt
└── README.md
创建第一个FastAPI应用
1. 编写 main.py
在app/main.py中,创建FastAPI应用,并定义一个简单的路由:
from fastapi import FastAPI
# 创建FastAPI实例
app = FastAPI()
# 路由:根路径(/)
@app.get("/")
async def read_root():
return {"message": "Hello, World!"}
解释:
FastAPI():创建一个FastAPI实例。
@app.get("/"):定义GET请求的路由,根路径返回一个简单的JSON响应。
async def read_root():使用异步函数来处理请求。
2. 运行应用
可以通过Uvicorn启动应用:
uvicorn app.main:app --reload
app.main:app表示从app/main.py中加载FastAPI实例。
--reload参数使应用在代码修改后自动重载。
3. 访问应用
打开浏览器并访问 http://127.0.0.1:8000/,你应该看到如下输出:
{"message": "Hello, World!"}
路由与请求
FastAPI支持多种HTTP方法,包括GET、POST、PUT、DELETE等。我们来继续扩展API,增加一个POST请求,处理JSON数据。
1. 定义一个Pydantic模型
Pydantic是FastAPI用于数据验证和序列化的工具。我们可以定义一个Pydantic模型来确保API接收的数据格式正确。
在app/schemas.py中:
from pydantic import BaseModel
# 创建Pydantic模型
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
解释:
BaseModel是所有Pydantic模型的基类。
name, description, price, tax是模型的字段,类型是Python的数据类型,FastAPI会根据这些类型自动进行数据验证。
2. 添加POST路由
在app/main.py中,定义一个POST路由,接收Item模型的数据:
from fastapi import FastAPI
from app.schemas import Item
app = FastAPI()
@app.post("/items/")
async def create_item(item: Item):
return {"name": item.name, "price": item.price}
解释:
@app.post("/items/"):定义POST请求,路径为/items/。
item: Item:FastAPI会自动解析请求体中的JSON数据,并将其映射到Item模型。
3. 测试POST请求
使用工具如Postman或cURL,向 http://127.0.0.1:8000/items/ 发送一个POST请求:
{
"name": "Laptop",
"description": "A high-end laptop",
"price": 1200.50,
"tax": 100.00
}
响应应该是:
{
"name": "Laptop",
"price": 1200.5
}
自动生成文档
FastAPI自动生成API文档并提供两个界面:
1. Swagger UI:默认在/docs路径下提供。
2. ReDoc:默认在/redoc路径下提供。
你可以访问:
Swagger UI
ReDoc
异步支持
FastAPI支持异步路由函数,可以提高处理并发请求的性能。在FastAPI中,异步函数由async def声明,结合异步数据库查询或其他IO操作,能够大幅提升应用的吞吐量。
@app.get("/items/{item_id}")
async def read_item(item_id: int):
# 模拟异步数据库查询
item = await fake_db_query(item_id)
return {"item": item}
在实际应用中,可以将数据库操作、文件处理等I/O密集型任务实现为异步操作,从而提升性能。
请求与响应模型
FastAPI允许你为请求体、响应体及查询参数使用模型。这些模型不仅能进行数据验证,还能自动生成API文档。
1. 自定义响应模型
你可以自定义响应体的结构,保证返回的数据符合预期格式:
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
class ResponseModel(BaseModel):
success: bool
data: Item
@app.post("/create_item/", response_model=ResponseModel)
async def create_item(item: Item):
return ResponseModel(success=True, data=item)
2. 查询参数模型
FastAPI允许你通过定义模型来处理查询参数,使其更清晰易读:
from fastapi import FastAPI, Query
@app.get("/items/")
async def get_items(skip: int = Query(0, alias="page", ge=0), limit: int = Query(10, le=100)):
return {"skip": skip, "limit": limit}
在上面的代码中,我们使用了Query类来定义查询参数。ge表示参数的最小值,le表示最大值。
部署FastAPI应用
使用Docker部署
FastAPI可以与Docker一起使用,方便部署到任何环境。以下是一个简单的Dockerfile示例:
# 使用官方Python镜像
FROM python:3.9
# 设置工作目录
WORKDIR /app
# 安装依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 复制项目代码
COPY . .
# 运行应用
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
构建和运行Docker镜像
docker build -t fastapi-example .
docker run -d -p 8000:8000 fastapi-example
现在,FastAPI应用就可以通过http://localhost:8000访问。
总结
FastAPI是一个功能强大、易于使用的框架,提供了强类型的验证、自动生成文档和高效的异步支持。通过本教程,我们创建了一个简单的FastAPI应用,并演示了如何处理GET和POST请求,进行数据验证,并实现API文档的自动生成。你还可以使用Docker将应用部署到生产环境中。
希望这篇教程能够帮助你快速上手FastAPI,并开始构建高效的API服务!