FastAPI:背景与使用案例介绍
FastAPI的背景
FastAPI是一个现代、快速(高性能)的Web框架,基于Python 3.7+编写,利用Python的类型提示(type hints)来实现自动生成文档和高效的数据验证。由Sebastián Ramírez在2018年发布,FastAPI的设计目标是尽可能高效地开发API,特别适用于需要高性能的应用,如微服务架构、实时数据处理和机器学习应用。
FastAPI的核心是基于Starlette作为其Web框架底层,并使用Pydantic进行数据模型验证。通过这种组合,FastAPI可以处理复杂的数据验证和序列化,同时保持代码的简洁和易读。其主要特点包括:
- 高性能:FastAPI的性能非常高,接近于同样使用Python的其他高性能框架,如Sanic和Uvicorn。
- 自动生成文档:FastAPI能够通过Swagger UI和Redoc自动生成漂亮且实用的API文档,减少文档编写工作量。
- 类型安全:利用Python 3.7+的类型提示,FastAPI可以在开发时提供类型安全和智能代码补全,同时进行自动数据验证。
- 支持异步编程:FastAPI天然支持异步编程,能够处理高并发请求。
FastAPI的使用案例
1. Uber的MICRO定价系统
Uber使用FastAPI来构建其部分MICRO服务,尤其是在处理实时定价系统时。FastAPI的高性能和异步特性使得它能够在短时间内处理大量并发请求,确保乘客和司机能够获得准确和实时的价格信息。
2. Netflix的内部工具
Netflix在内部使用FastAPI构建了一些工具和服务。这些工具用于数据科学和机器学习团队的日常工作,包括数据处理、模型预测和任务自动化等。FastAPI的类型提示和自动文档生成功能帮助开发者在开发和维护这些工具时更高效、更准确。
3. Exploding Topics API
Exploding Topics是一个通过分析趋势来发现新兴话题的网站。该平台使用FastAPI来提供API服务,帮助客户访问这些趋势数据。由于FastAPI的高效性和自动文档生成功能,Exploding Topics团队能够快速迭代开发,并为客户提供稳定、快速的API接口。
4. Sentiment Analysis API
一个使用FastAPI的情感分析API项目,允许用户通过提交文本数据来获取该文本的情感分析结果。该API集成了预训练的自然语言处理模型(如BERT),通过FastAPI对外提供服务。FastAPI的高性能处理能力确保了即使在高并发的情况下,API依然能提供快速的响应。
5. ML模型部署
某公司开发了一套用于金融数据预测的机器学习模型,并使用FastAPI将这些模型部署到生产环境。通过FastAPI提供的API,用户可以上传输入数据并获取预测结果。FastAPI支持的异步请求和自动生成的Swagger文档使得这套系统既高效又易于使用。
6. 视频处理服务
一个视频处理和转换平台使用FastAPI来管理视频文件的上传、处理(如格式转换、剪辑等)和下载。FastAPI的异步处理能力能够很好地支持这种高I/O的操作场景,确保视频文件能够迅速处理并提供给用户。
7. IoT设备管理
某公司使用FastAPI开发了一个用于管理和监控IoT设备的后台系统。这个系统通过API来收集和处理大量设备的状态数据,并执行控制指令。FastAPI提供的高并发处理能力确保系统能够实时监控和控制大量的IoT设备。
8. 个人博客系统
开发者使用FastAPI构建了一个个人博客系统,支持文章的创建、编辑、删除和展示。通过FastAPI的路径参数和请求体支持,这个博客系统能够快速处理各种请求,同时集成的Swagger文档让用户可以轻松了解API的使用方法。
9. 数据可视化平台
一个数据科学团队使用FastAPI搭建了一个内部的数据可视化平台,允许用户通过API上传数据并生成各种图表。FastAPI的快速开发能力帮助团队在短时间内推出了这个平台,并支持后续的功能扩展。
10. 身份验证和授权服务
FastAPI被用于构建一个身份验证和授权服务,负责处理用户登录、注册、权限管理等功能。该服务使用OAuth2标准,并通过FastAPI对外提供安全、快速的API接口。
FastAPI用户注册与登录系统示例
概述
本文档展示了如何使用FastAPI创建一个简单的用户注册和登录系统。这个系统包含了用户的注册、登录以及获取当前用户信息的功能,并通过JWT令牌来管理用户的身份验证。
依赖安装
在开始编写代码之前,需要安装以下依赖库:
pip install fastapi uvicorn pydantic passlib bcrypt python-jose
代码示例
以下是完整的代码示例:
from fastapi import FastAPI, HTTPException, Depends
from pydantic import BaseModel, EmailStr
from typing import Optional
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from passlib.context import CryptContext
from jose import JWTError, jwt
from datetime import datetime, timedelta
# FastAPI应用实例
app = FastAPI()
# 密码加密解密工具
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
# OAuth2 密码流
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
# 模拟的数据库
fake_users_db = {}
# 密钥和算法
SECRET_KEY = "a1b2c3d4e5f6g7h8i9j0k"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30
# Pydantic 模型定义
class User(BaseModel):
username: str
email: EmailStr
full_name: Optional[str] = None
disabled: Optional[bool] = None
class UserInDB(User):
hashed_password: str
class UserCreate(BaseModel):
username: str
email: EmailStr
password: str
# 密码加密和验证
def verify_password(plain_password, hashed_password):
return pwd_context.verify(plain_password, hashed_password)
def get_password_hash(password):
return pwd_context.hash(password)
# 获取用户信息
def get_user(db, username: str):
if username in db:
user_dict = db[username]
return UserInDB(**user_dict)
# 验证用户
def authenticate_user(fake_db, username: str, password: str):
user = get_user(fake_db, username)
if not user:
return False
if not verify_password(password, user.hashed_password):
return False
return user
# 生成访问令牌
def create_access_token(data: dict, expires_delta: Optional[timedelta] = None):
to_encode = data.copy()
if expires_delta:
expire = datetime.utcnow() + expires_delta
else:
expire = datetime.utcnow() + timedelta(minutes=15)
to_encode.update({"exp": expire})
encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
return encoded_jwt
# 注册用户接口
@app.post("/register")
async def register(user: UserCreate):
if user.username in fake_users_db:
raise HTTPException(status_code=400, detail="Username already registered")
hashed_password = get_password_hash(user.password)
fake_users_db[user.username] = {"username": user.username, "email": user.email, "full_name": user.full_name, "hashed_password": hashed_password}
return {"message": "User registered successfully"}
# 生成令牌接口
@app.post("/token")
async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends()):
user = authenticate_user(fake_users_db, form_data.username, form_data.password)
if not user:
raise HTTPException(
status_code=400,
detail="Incorrect username or password",
headers={"WWW-Authenticate": "Bearer"},
)
access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
access_token = create_access_token(
data={"sub": user.username}, expires_delta=access_token_expires
)
return {"access_token": access_token, "token_type": "bearer"}
# 获取当前用户信息接口
@app.get("/users/me", response_model=User)
async def read_users_me(token: str = Depends(oauth2_scheme)):
credentials_exception = HTTPException(
status_code=401,
detail="Could not validate credentials",
headers={"WWW-Authenticate": "Bearer"},
)
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
username: str = payload.get("sub")
if username is None:
raise credentials_exception
except JWTError:
raise credentials_exception
user = get_user(fake_users_db, username=username)
if user is None:
raise credentials_exception
return user
代码说明
-
用户注册:使用
/register
接口,用户可以注册并创建账号。用户的密码会通过bcrypt
加密存储在模拟数据库中。 -
用户登录:使用
/token
接口,用户可以通过用户名和密码获取访问令牌(JWT)。这个令牌在后续的请求中将用于验证用户身份。 -
获取用户信息:使用
/users/me
接口,用户可以通过提供JWT令牌来获取自己的信息。令牌验证通过后,API会返回用户信息。
运行方式
-
安装依赖:
pip install fastapi uvicorn pydantic passlib bcrypt python-jose
-
运行服务器:
uvicorn main:app --reload
-
在浏览器中访问
http://127.0.0.1:8000/docs
,你将看到自动生成的Swagger UI文档,可以直接在文档中测试注册、登录和获取用户信息的API。