FastAPI 是一个用于构建 Web API 的现代化、高性能框架。它建立在 Starlette 和 Pydantic 之上,利用 Python 的异步特性来实现高效的处理。FastAPI 以其快速开发、自动生成文档和出色的性能而受到广泛关注,特别是在数据密集型应用程序中,如机器学习和数据科学项目。
async
和 await
功能,便于处理异步请求。下面我们来构建一个简单的 FastAPI 应用来了解其基本用法。
# 首先确保安装了 fastapi 和 uvicorn
# pip install fastapi uvicorn
from fastapi import FastAPI
# 创建 FastAPI 实例
app = FastAPI()
# 定义一个路径操作装饰器,处理 GET 请求
@app.get("/")
async def read_root():
return {"Hello": "World"}
# 定义带有路径参数的 API
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
# 运行应用
# 使用命令: uvicorn main:app --reload
在上述代码中,我们创建了一个简单的 FastAPI 应用,它包含两个路径操作:根路径 /
和带参数的 /items/{item_id}
路径。该应用可以通过 Uvicorn 运行,并且随着代码的更新自动重载。
FastAPI 对路径参数和查询参数提供了灵活的支持。如上例,item_id
是路径参数,而 q
是查询参数。如果不传 q
,它的默认值为 None
。
FastAPI 使用 Pydantic 模型来定义请求体。Pydantic 提供了强大的数据验证和解析功能,使请求的数据验证简单明了。
from pydantic import BaseModel
# 定义 Pydantic 模型
class Item(BaseModel):
name: str
price: float
is_offer: bool = None
# 处理 POST 请求
@app.post("/items/")
async def create_item(item: Item):
return item
在这个例子中,我们定义了一个 Item
模型,其中包含 name
、price
和 is_offer
三个字段。FastAPI 会自动验证请求的 JSON 数据,确保其符合 Item
模型的定义。
使用 uvicorn
可以高效地运行 FastAPI 应用。Uvicorn 是一个支持 ASGI 的轻量级 Web 服务器。
运行命令:
uvicorn main:app --reload
其中 main
是 Python 文件的名称,app
是 FastAPI 实例的变量名。--reload
参数使服务器在检测到代码变化时自动重新启动,非常适合开发环境。
FastAPI 内置了自动生成 API 文档的功能,可以在 /docs
路径访问基于 Swagger UI 的交互式界面。同时在 /redoc
路径访问 ReDoc 提供的文档。
FastAPI 强烈支持异步编程,通过使用 async
和 await
,开发者可以利用 Python 异步 I/O 操作,比如数据库查询或调用外部服务。
@app.get("/async-items/")
async def get_items():
# 假设这是一个异步数据库操作
items = await some_async_db_query()
return items
这一特性对于 I/O 密集型的应用来说非常理想,使得应用能够处理更高的并发请求数。
FastAPI 允许添加中间件来拦截请求和响应,从而执行如日志记录、鉴权等操作。
from fastapi.middleware.cors import CORSMiddleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
FastAPI 提供了强大的依赖注入功能,通过函数参数类型和注解实现。在处理复杂业务逻辑时(如权限控制、数据库会话管理),可以极大简化代码。
from fastapi import Depends
def get_db():
# 假设这是一个数据库会话生成器
db = create_db_session()
try:
yield db
finally:
db.close()
@app.get("/users/")
async def read_users(db: Session = Depends(get_db)):
users = db.query(User).all()
return users
FastAPI 是一个功能强大且富有表现力的 Web 框架,专注于易于使用的开发体验和高性能。它的类型验证、自动文档生成、异步支持及现代化设计使得它非常适合构建高效的 API 服务。随着对异步编程需求的增长,FastAPI 的优势愈加明显,尤其是在构建实时应用和微服务中。