Python Web 框架:FastAPI

FastAPI 是一个现代、高性能的 Python Web 框架,专为构建 API 而生。它基于 Python 的类型提示,能够自动进行数据校验并生成 API 文档,是当前 Python 生态中增长最快的 Web 框架之一。

FastAPI 的核心特性

FastAPI 之所以备受青睐,主要得益于它这些"自带光环"的特性:

  • 极高的性能:基于 Starlette(异步框架)和 Pydantic(数据校验库)构建,性能可媲美 Node.js 和 Go,在 Python Web 框架中处于顶尖水平。

  • 自动生成 API 文档 :无需手动编写,代码即文档。它会自动为你生成交互式 Swagger UI (/docs) 和 ReDoc (/redoc) 文档,极大方便了调试和前后端协作。

  • 强大的数据校验:利用 Pydantic 和 Python 类型提示,能自动校验请求体、查询参数等,确保数据准确,并在校验失败时自动返回清晰的错误信息。

  • 原生异步支持 :完美支持 async/await 语法,能高效处理高并发 I/O 场景,非常适合构建微服务和实时 Web 应用。

  • 灵活的依赖注入系统 :通过 Depends 机制,可以轻松管理数据库会话、权限验证、配置等依赖,让代码更解耦、更易于测试和复用。

使用

1. 安装与环境准备

建议创建一个虚拟环境来隔离项目依赖。

复制代码
# 创建并激活虚拟环境 (以venv为例)
python -m venv venv
source venv/bin/activate  # Linux/macOS
# venv\Scripts\activate  # Windows

# 安装 FastAPI 和 ASGI 服务器 Uvicorn
pip install fastapi uvicorn[standard]

2. 编写第一个 API

创建一个 main.py 文件:

复制代码
from fastapi import FastAPI

# 1. 创建 FastAPI 应用实例
app = FastAPI()

# 2. 定义路径操作装饰器 (根路径 /)
@app.get("/")
async def read_root():
    # 返回 JSON 响应
    return {"message": "Hello, FastAPI!"}

# 3. 定义另一个带路径参数的 API
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "query": q}

3. 启动服务

在终端中运行以下命令:

复制代码
uvicorn main:app --reload
  • main:指 main.py 文件。

  • app:指文件中创建的 FastAPI 实例。

  • --reload:开启热重载,代码修改后服务器会自动重启,方便开发。

4. 查看效果

服务启动后,可以访问以下地址:

  • API 端点 :http://127.0.0.1:8000/ 或 http://127.0.0.1:8000/items/5

  • Swagger UI 文档 :http://127.0.0.1:8000/docs

  • ReDoc 文档 :http://127.0.0.1:8000/redoc

路由与参数

定义路由

使用装饰器 @app.get()、@app.post()、@app.put()、@app.delete() 等来定义对应 HTTP 方法的路由。

复制代码
from fastapi import FastAPI

app = FastAPI()

@app.get("/users/")
async def get_users():
    return [{"username": "alice"}, {"username": "bob"}]

@app.post("/users/")
async def create_user():
    # 创建用户的逻辑
    return {"message": "User created"}

参数处理

FastAPI 能自动识别三种主要参数类型。

1. 路径参数

从 URL 路径中获取参数,并支持类型声明和校验。

复制代码
from fastapi import FastAPI, Path

app = FastAPI()

@app.get("/books/{book_id}")
async def get_book(
    # 路径参数 book_id, 类型为 int, 校验其值大于 0 且小于 101
    book_id: int = Path(..., title="书籍ID", ge=1, le=100)
):
    return {"book_id": book_id}

2. 查询参数

URL 中问号后的键值对,如 /items?skip=0&limit=10。

复制代码
from fastapi import FastAPI, Query

app = FastAPI()

@app.get("/items/")
async def list_items(
    # 查询参数 skip 和 limit,带默认值和描述
    skip: int = Query(0, description="跳过的记录数"),
    limit: int = Query(10, description="返回的记录数")
):
    return {"skip": skip, "limit": limit}

3. 请求体参数

用于 POST、PUT 等请求,将 JSON 数据映射到 Pydantic 模型中。

复制代码
from fastapi import FastAPI
from pydantic import BaseModel, Field

app = FastAPI()

# 1. 定义请求体的数据结构
class UserCreate(BaseModel):
    username: str = Field(..., min_length=3, max_length=20, description="用户名")
    password: str = Field(..., min_length=6, description="密码")

@app.post("/register/")
async def register_user(user: UserCreate):
    # FastAPI 会自动将 JSON 请求体解析为 UserCreate 实例
    return {"message": f"User {user.username} registered"}

核心功能

功能 说明 示例场景
依赖注入 通过 Depends 注入数据库会话、配置、认证等依赖,实现解耦和复用。 db: Session = Depends(get_db)
响应模型 使用 response_model 参数来过滤和格式化输出数据,确保 API 返回结构一致。 @app.get("/user", response_model=UserOut)
中间件 处理请求和响应的全局逻辑,如日志记录、CORS 配置。 全局异常捕获、跨域设置。
后台任务 使用 BackgroundTasks 将发送邮件、处理图片等耗时操作放到后台异步执行,不阻塞响应。 用户注册后发送欢迎邮件。
文件上传 通过 UploadFile 类型轻松处理文件上传。 用户头像上传。
WebSocket 支持 WebSocket 协议,用于构建聊天、实时通知等应用。 实时聊天室。
相关推荐
北城笑笑13 分钟前
Vue 106 ,上篇:前端桌面端应用实现方案( Electron 框架详细介绍,Vue + Electron )
前端·javascript·vue.js·python·electron
青少儿编程课堂37 分钟前
蓝桥杯·全国青少年信息素养大赛·电子学会C/C++考级:分层图最短路解析
c++·python·算法·bfs·信息学竞赛
全栈练习生1 小时前
大模型原理之自适应推理
python·ai
一枕槐安4879 小时前
Qwen 通义千问本地部署与推理服务封装
fastapi·qwen·vllm·流式推理·openai兼容api·awq量化
实名上网宋凯宣10 小时前
Django
后端·python·django
如若12311 小时前
【论文复现】CoFailMed:从零复现医学图像分割的共享失败审计,含完整代码流程与科研绘图
人工智能·python
砚底藏山河12 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
视觉小萌新12 小时前
AI Class 3 · Chapter 1:变量、字符串、list/dict、if/for(python学习-小白版-有经验可跳过)
python·学习·list
在努力的前端小白13 小时前
基于FastAPI+LangChain+LangGraph+Agent+多模态的AI Agent 有渔渔具网站
人工智能·langchain·vue·fastapi
薛定谔的猫-菜鸟程序员13 小时前
软件架构设计师开发资料大全(从入门到精通)
后端·python·系统架构·flask·架构设计师