python的FastAPI框架

FastAPI 详解:现代高性能 Python API 框架

  • FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API。它基于 Python 3.8+ 标准类型提示(Type Hints),由 Sebastián Ramírez 开发。
    它是目前 Python 生态中最受欢迎的框架之一,特别是在数据科学、机器学习服务和微服务领域,正在迅速取代 Flask 和部分 Django 的使用场景。

一、核心优势(为什么要用 FastAPI?)

  • 高性能 (Fast):基于 Starlette(负责路由和 Web 部分)和 Pydantic(负责数据验证)。其性能与 NodeJS 和 Go 相当,是 Python 框架中速度最快的之一。

  • 开发效率极高:基于 Python 类型提示,编辑器可以提供极佳的代码补全和错误检查,减少约 40% 的人为错误。

  • 自动生成文档 :无需编写额外配置,框架会自动根据代码生成交互式 API 文档
    1.Swagger UI(默认地址 /docs
    2.ReDoc(默认地址 /redoc

  • 数据验证与序列化:自动处理 JSON 请求体、查询参数的解析和验证。如果数据格式错误,会自动返回清晰的报错信息。

  • 原生支持异步 (Async) :完美支持 Python 的 asyncawait,适合高并发场景。

  • 依赖注入 (Dependency Injection):拥有一个强大且易用的依赖注入系统,方便管理数据库连接、认证逻辑等。

二、快速入门

1. 安装

  • 需要安装 FastAPI 和一个 ASGI 服务器(通常使用 Uvicorn)。
bash 复制代码
pip install fastapi uvicorn

2. 编写代码(main.py

python 复制代码
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

# 定义数据模型 (Pydantic)
class Item(BaseModel):
    name: str
    price: float
    is_offer: Union[bool, None] = None

# 1. 基本 GET 请求
@app.get("/")
def read_root():
    return {"Hello": "World"}

# 2. 带路径参数和查询参数的 GET 请求
# 访问示例: /items/5?q=somequery
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
    # item_id 会自动转换为 int,如果不符合会报错
    return {"item_id": item_id, "q": q}

# 3. 带请求体 (JSON) 的 POST 请求
@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
    return {"item_name": item.name, "item_id": item_id, "price": item.price}

3. 运行服务

  • 在终端中运行:
bash 复制代码
uvicorn main:app --reload

参数说明:

  • main: 文件名 main.py

  • app: 代码中 app = FastAPI() 的变量名

  • --reload: 代码修改后自动重启服务器(开发模式推荐)

4. 查看结果

  • 访问 http://127.0.0.1:8000/items/5?q=test,可看到 JSON 响应。

  • 访问 http://127.0.0.1:8000/docs,可打开自动生成的 Swagger UI,直接在网页上测试接口。

三、核心概念解析

1. Pydantic(数据验证)

FastAPI 强烈依赖 Pydantic。定义一个继承自 BaseModel 的类,FastAPI 会自动完成:

  • 解析:将 JSON 转换为 Python 对象。

  • 验证 :确保字段类型正确(比如 price 必须是 float)。

  • 过滤:自动忽略未定义的额外字段。

2. 异步(Async/Await)

  • 如果代码中有 IO 操作(如读写数据库、请求第三方 API),可以使用 async 定义路由:
python 复制代码
@app.get("/users/")
async def read_users():
    results = await some_async_database_query()
    return results
  • FastAPI 会自动在事件循环中处理异步逻辑。

3. 依赖注入(Depends)

  • 这是 FastAPI 最优雅的设计之一,用于提取通用逻辑,例如获取数据库会话或验证用户 Token。
python 复制代码
from fastapi import Depends, FastAPI

def common_parameters(q: str | None = None, skip: int = 0, limit: int = 100):
    return {"q": q, "skip": skip, "limit": limit}

@app.get("/items/")
def read_items(commons: dict = Depends(common_parameters)):
    return commons

四、FastAPI vs Flask vs Django

特性 FastAPI Flask Django
定位 现代高性能 API 框架 轻量级微框架 全栈重量级框架
性能 极高 (ASGI) 一般 (WSGI) 一般 (WSGI)
异步支持 原生优秀 后期添加 (2.0+) 后期添加 (3.0+)
数据验证 内置 (Pydantic) 需插件 (如 Marshmallow) 内置 (Forms/Serializers)
文档生成 自动 (Swagger/ReDoc) 需插件 需插件 (DRF + Swagger)
学习曲线 中等 (需懂 Python 类型提示) 简单 陡峭
适用场景 高并发 API、ML 模型服务、微服务 简单应用、快速原型 传统 CMS、大型单体应用

五、什么时候选择 FastAPI?

  1. 需要构建 RESTful API(前后端分离)。

  2. 非常看重 执行速度开发速度

  3. 喜欢 Python 的 Type Hints(类型提示)。

  4. 需要 自动生成文档 给前端或第三方使用。

  5. 需要部署 机器学习模型(TensorFlow/PyTorch 等通常需要高性能 API 包装)。

总结

  • FastAPI 是目前 Python Web 开发的新标准。虽然 Django 依然在全栈开发中占据主导地位,Flask 依然适合极简任务,但如果主要是做 API 开发,FastAPI 通常是最好的选择。
相关推荐
lsx2024061 小时前
CSS3 分页设计指南
开发语言
CHANG_THE_WORLD1 小时前
Python 切片操作全面解析
开发语言·python
不会代码的小猴1 小时前
C++的第十二天笔记
开发语言·c++·笔记
Boop_wu1 小时前
[Java EE] 字符流和字节流实例
java·开发语言·apache
是一个Bug1 小时前
Spring事件监听器在电商订单系统中的应用
java·python·spring
shangjian0072 小时前
Python基础-闭包和装饰器
开发语言·python
三维空间2 小时前
如何在Python多进程中避免死锁问题?
python
冤大头编程之路2 小时前
Python并发编程实操教程:多线程/多进程/异步全解析
python
dhdjjsjs2 小时前
Day30 Python Study
开发语言·前端·python