Python生态中有很多用于构建Web API的框架,FastAPI是近年来热度很高的选择,它基于Starlette和Pydantic构建,支持异步编程,性能表现优异,同时自带OpenAPI规范支持,可自动生成交互式接口文档,非常适合快速开发REST API。

环境准备
首先需要安装FastAPI和用于运行服务的ASGI服务器uvicorn,执行以下命令即可完成安装:
pip install fastapi uvicorn
第一个FastAPI接口
创建一个名为main.py的文件,编写最简单的接口代码:
from fastapi import FastAPI
# 初始化FastAPI应用实例
app = FastAPI()
# 定义根路径的GET请求接口
@app.get("/")
def read_root():
return {"message": "Hello, FastAPI"}
运行服务使用以下命令:
uvicorn main:app --reload
启动后访问127.0.0.1:8000,就能看到接口返回的JSON数据。同时访问127.0.0.1:8000/docs可以打开自动生成的交互式接口文档,直接在页面上测试接口。
定义带路径参数的接口
REST API经常需要接收路径中的参数,比如获取指定ID的用户信息,FastAPI可以直接在函数参数中声明路径参数:
from fastapi import FastAPI
app = FastAPI()
# 路径参数item_id,类型为int
@app.get("/items/{item_id}")
def read_item(item_id: int):
return {"item_id": item_id, "name": f"Item_{item_id}"}
FastAPI会自动对路径参数做类型校验,如果传入的item_id不是数字,会直接返回对应的错误提示。
处理查询参数
除了路径参数,接口还经常需要接收查询参数,比如分页参数、筛选条件等,查询参数不需要在路径中声明,直接在函数参数中定义即可:
from fastapi import FastAPI
app = FastAPI()
@app.get("/users/")
def read_users(skip: int = 0, limit: int = 10):
# 模拟用户数据
users = [{"id": i, "name": f"User_{i}"} for i in range(1, 21)]
return users[skip: skip + limit]
访问/users/?skip=5&limit=5就可以获取第6到第10条用户数据,查询参数也支持类型声明,FastAPI会自动做类型转换和校验。
使用Pydantic定义请求体
当接口需要接收POST请求的JSON数据时,可以使用Pydantic的模型来定义请求体的结构,FastAPI会自动做数据校验和解析:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
# 定义请求体模型
class Item(BaseModel):
name: str
price: float
is_offer: bool = None
@app.post("/items/")
def create_item(item: Item):
return {"item_name": item.name, "item_price": item.price, "is_offer": item.is_offer}
发送POST请求到/items/,传入符合Item结构的JSON数据,FastAPI会自动解析并校验数据,不符合要求会返回明确的错误提示。
常用功能扩展
FastAPI还支持很多REST API常用的功能,比如:
- 响应模型:通过response_model参数指定接口返回的数据结构,自动过滤多余字段
- 异常处理:使用HTTPException抛出指定状态码和错误信息的异常
- 依赖注入:通过Depends实现公共逻辑复用,比如鉴权、数据库连接等
- 异步支持:接口函数可以使用async def定义,支持异步操作,提升高并发场景下的性能
以下是一个带响应模型和异常处理的接口示例:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import Optional
app = FastAPI()
class ItemResponse(BaseModel):
item_id: int
name: str
price: float
fake_db = {
1: {"name": "Item1", "price": 10.5},
2: {"name": "Item2", "price": 20.0}
}
@app.get("/items/{item_id}", response_model=ItemResponse)
def read_item(item_id: int):
if item_id not in fake_db:
raise HTTPException(status_code=404, detail="Item not found")
item_data = fake_db[item_id]
return {"item_id": item_id, **item_data}
通过以上内容,已经可以覆盖大部分基础REST API的开发需求,FastAPI的官方文档还有更多高级用法可以查阅学习,能够快速满足各类API开发场景的需要。