FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,由 Starlette 框架和 Pydantic 类型注解驱动。它旨在提供一种简单、快速且易于扩展的方式来创建 API。对于新手来说,FastAPI 的简洁性和易用性使其成为快速入门的好选择。以下是关于如何快速上手 FastAPI 框架的全面教程文档解析。
快速安装和设置
安装 FastAPI 和 Uvicorn
首先,您需要安装 FastAPI 和 Uvicorn。Uvicorn 是一个 ASGI 服务器,用于运行 FastAPI 应用。
pip install fastapi uvicorn
创建项目结构
创建一个新目录来存放您的项目,并在其中创建以下文件和目录:
my_fastapi_project/
│
├── main.py
├── app/
│ ├── __init__.py
│ └── models.py
│
└── requirements.txt
在 requirements.txt 文件中,列出所有项目依赖项。
快速入门示例
创建基本的 FastAPI 应用
在 main.py 文件中,创建一个基本的 FastAPI 应用:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"message": "Hello, world!"}
运行应用
使用 Uvicorn 运行应用:
uvicorn main:app --reload
这将在本地启动一个服务器,默认端口为 8000。您可以在浏览器中访问 http://127.0.0.1:8000 来查看应用。
路由和视图
FastAPI 使用 Python 函数作为路由和视图。以下是创建路由和视图的示例:
创建路由
@app.get("/items/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}
创建嵌套路由
@app.get("/users/{user_id}/items/{item_id}")
async def read_user_item(user_id: int, item_id: int):
return {"user_id": user_id, "item_id": item_id}
数据模型
使用 Pydantic 来定义数据模型:
定义 Pydantic 模型
from pydantic import BaseModel
class Item(BaseModel):
id: int
name: str
description: str = None
price: float
tax: float = None
使用模型
@app.post("/items/")
async def create_item(item: Item):
return item
异常处理
FastAPI 支持自动异常处理:
from fastapi import HTTPException
@app.get("/items/{item_id}")
async def read_item(item_id: int):
if item_id <= 0:
raise HTTPException(status_code=400, detail="Item ID must be positive")
return {"item_id": item_id}
安全性和认证
FastAPI 支持多种安全性和认证机制:
使用 OAuth2
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
@app.post("/token")
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
return {"access_token": "secret", "token_type": "bearer"}
使用 JWT
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from jose import JWTError, jwt
from datetime import datetime, timedelta
SECRET_KEY = "your_secret_key"
ALGORITHM = "HS256"
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
def create_access_token(data: dict):
to_encode = data.copy()
expire = datetime.utcnow() + timedelta(minutes=30)
to_encode.update({"exp": expire})
encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
return encoded_jwt
@app.post("/token")
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
user = authenticate_user(fake_db, form_data.username, form_data.password)
if not user:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Incorrect username or password",
headers={"WWW-Authenticate": "Bearer"},
)
access_token = create_access_token(data={"sub": user.username})
return {"access_token": access_token, "token_type": "bearer"}
@app.get("/users/me")
async def read_users_me(token: str = Depends(oauth2_scheme)):
credentials_exception = HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
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_by_username(fake_db, username)
if user is None:
raise credentials_exception
return {"username": user.username}
总结
FastAPI 是一个功能强大的 Web 框架,可以帮助您快速创建 API。通过本文档,您应该已经了解了如何快速上手 FastAPI,包括安装、设置、创建路由、数据模型、异常处理、安全性和认证等方面。继续实践和探索 FastAPI 的更多功能,您将能够构建出更加高效和可扩展的 API。
