掌握FastAPI,从官方文档开始:深度解读,轻松入门进阶
简介
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,由 Python 3.6+ 支持。它基于标准 Python 类型提示,具有异步支持,并且可以与任何数据库或任何其他异步库一起使用。本文将基于 FastAPI 的官方文档,为您深度解读该框架,帮助您轻松入门并进阶。
快速安装
首先,您需要安装 FastAPI 和 Uvicorn,一个用于运行 FastAPI 应用程序的 ASGI 服务器。以下是安装命令:
pip install fastapi uvicorn
快速入门
创建项目
创建一个新的目录,然后使用以下命令初始化一个 FastAPI 项目:
cd path/to/your/project python -m venv venv source venv/bin/activate # 在 Windows 上使用 .venvScriptsactivate pip install fastapi uvicorn
编写第一个 FastAPI 应用程序
创建一个名为 main.py
的文件,并添加以下代码:
from fastapi import FastAPI app = FastAPI() @app.get("/") async def root(): return {"message": "Hello World"}
使用以下命令运行应用程序:
uvicorn main:app --reload
打开浏览器访问 http://127.0.0.1:8000/
,您将看到以下响应:
{ "message": "Hello World" }
路由和响应
FastAPI 使用 Python 路由和响应对象来定义 API。以下是一些示例:
获取请求参数
@app.get("/items/{item_id}") async def read_item(item_id: int): return {"item_id": item_id}
使用路径参数
@app.get("/users/{user_id}") async def read_user(user_id: str): return {"user_id": user_id}
使用查询参数
@app.get("/items/") async def read_items(q: str = None): if q: return {"q": q} return {"message": "Query parameter 'q' not provided"}
数据验证
FastAPI 使用 Pydantic 进行数据验证。以下是一个示例:
from pydantic import BaseModel class Item(BaseModel): name: str description: str = None price: float tax: float = None @app.post("/items/") async def create_item(item: Item): return item
异步支持
FastAPI 支持异步操作,您可以使用 async
和 await
关键字。以下是一个示例:
from typing import List @app.get("/items/") async def read_items(q: str = None): if q: return {"q": q} return {"message": "Query parameter 'q' not provided"}
依赖注入
FastAPI 支持依赖注入,您可以使用 Depends
装饰器。以下是一个示例:
from fastapi import Depends, HTTPException from fastapi.security import OAuth2PasswordBearer oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") @app.post("/token") async def token(form_data: OAuth2PasswordRequestForm = Depends()): return {"access_token": "token", "token_type": "bearer"}
进阶学习
中间件
FastAPI 支持中间件,允许您在请求和响应之间添加自定义逻辑。以下是一个示例:
from fastapi import FastAPI, Request app = FastAPI() @app.middleware("http") async def add_process_time_header(request: Request, call_next): start_time = time.time() response = await call_next(request) process_time = time.time() - start_time response.headers["X-Process-Time"] = str(process_time) return response
安全性
FastAPI 提供了多种安全性支持,包括 OAuth2、JWT 和密码哈希。以下是一个使用 OAuth2 的示例:
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") @app.post("/token") async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends()): user = authenticate_user(username=form_data.username, password=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"}
集成其他库
FastAPI 可以与许多其他库集成,例如数据库、缓存、认证和授权等。以下是一个使用 SQLAlchemy 集成的示例:
from fastapi import FastAPI from sqlalchemy.orm import Session from .database import SessionLocal, engine from . import models, schemas app = FastAPI() models.Base.metadata.create_all(bind=engine) def get_db(): db = SessionLocal() try: yield db finally: db.close()
总结
通过本文的深度解读,您应该已经对 FastAPI 有了一定的了解。FastAPI 是一个功能强大的 Web 框架,可以轻松构建高性能的 API。建议您查阅官方文档以获取更多信息和示例。祝您学习愉快!