FastAPI是一个现代、快速(高性能)的Web框架,用于构建API,由Python 3.6+编写。它基于标准Python类型提示,并使用Starlette和Pydantic。FastAPI旨在成为构建API的“最佳实践”,它简单易用,同时提供了许多高级功能。
快速入门
要开始使用FastAPI,首先需要安装FastAPI和Uvicorn(一个ASGI服务器)。以下是基本的安装和运行步骤:
# 安装FastAPI
pip install fastapi uvicorn
# 创建一个名为main.py的文件
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}
然后,在终端中运行以下命令:
uvicorn main:app --reload
访问 http://127.0.0.1:8000,你应该会看到一个响应为 {"Hello": "World"} 的页面。
FastAPI的核心特性
类型提示
FastAPI利用Python的类型提示来提供自动完成、类型检查和验证等功能。这意味着你可以通过类型提示来定义请求和响应的数据结构。
from pydantic import BaseModel
class Item(BaseModel):
id: int
name: str
description: str = None
price: float
tax: float = None
自动文档
FastAPI会自动生成一个交互式的API文档,你可以通过访问 /docs 或 /redoc 来查看。
性能
FastAPI在性能方面非常出色。它使用了Starlette作为Web服务器,并使用了Uvicorn作为ASGI服务器。这使得FastAPI在处理大量请求时非常高效。
依赖注入
FastAPI使用依赖注入来处理依赖项。这意味着你可以轻松地将数据库连接、认证令牌等依赖项注入到你的路由中。
from fastapi import FastAPI, Depends, HTTPException
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
if q:
return {"item_id": item_id, "q": q}
else:
return {"item_id": item_id}
异步支持
FastAPI是完全异步的,这意味着它可以利用Python的异步特性来提高性能。
@app.get("/items/{item_id}")
async def read_item(item_id: int):
# 模拟异步操作
await asyncio.sleep(2)
return {"item_id": item_id}
高级特性
权限和认证
FastAPI支持多种权限和认证方法,如OAuth2、JWT、Basic Auth等。
from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
@app.post("/token")
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
# 这里应该有用户验证逻辑
return {"access_token": "token", "token_type": "bearer"}
@app.get("/users/me")
async def read_users_me(token: str = Depends(oauth2_scheme)):
# 这里应该有用户验证逻辑
return {"username": "test"}
数据库集成
FastAPI可以轻松地与各种数据库集成,如SQLAlchemy、Gino、Tortoise ORM等。
from fastapi import FastAPI
from sqlalchemy.orm import Session
from . import models, schemas
app = FastAPI()
# 创建数据库模型
models.Base.metadata.create_all(bind=engine)
@app.post("/items/")
def create_item(item: schemas.Item, db: Session = Depends(get_db)):
db_item = models.Item(name=item.name, description=item.description, price=item.price)
db.add(db_item)
db.commit()
db.refresh(db_item)
return db_item
总结
FastAPI是一个功能强大、易于使用的Web框架,适用于构建高性能的API。它提供了许多高级特性,如类型提示、自动文档、异步支持等。如果你正在寻找一个快速、高效、易于使用的Web框架,FastAPI绝对是一个值得考虑的选择。
