Python——FastAPI

FastAPI 是一个现代、快速(高性能)的 Python Web 框架,基于标准 Python 类型提示,专为构建 API 设计。它的主要特点是快速开发、高性能、使用类型提示自动生成文档,以及对异步操作的支持。

1. 安装 FastAPI 和 Uvicorn

在开始使用 FastAPI 之前,你需要安装 FastAPI 和 ASGI 服务器(如 Uvicorn)来运行它。

bash 复制代码
pip install fastapi uvicorn

2. 创建一个简单的 FastAPI 应用

python 复制代码
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}

说明:

  • FastAPI():创建一个 FastAPI 应用实例。
  • @app.get("/"):这是一个路径操作装饰器,用于声明 HTTP GET 请求的路径(在这个例子中是根路径/)。
  • read_root:路径操作函数,当访问 / 时,会返回一个包含 "Hello": "World" 的 JSON 响应。

3. 运行应用

使用 Uvicorn 运行你的应用:

bash 复制代码
uvicorn main:app --reload
  • main:appmain 是你的 Python 文件名(不带 .py 后缀),app 是 FastAPI 实例。
  • --reload:启用自动重新加载功能,当代码更改时自动重启服务器。

4. 请求方法示例

FastAPI 支持多种 HTTP 方法,如 GETPOSTPUTDELETE 等。下面是不同方法的示例。

4.1. GET 请求
python 复制代码
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

说明:

  • item_id: int:路径参数,要求为整数类型。
  • q: str = None:查询参数,可选,默认为 None
4.2. POST 请求
python 复制代码
from pydantic import BaseModel

class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None

@app.post("/items/")
def create_item(item: Item):
    return item

说明:

  • Item:这是一个使用 Pydantic 定义的数据模型,用于请求体验证。
  • @app.post("/items/"):声明一个 POST 路径操作,当客户端发送一个符合 Item 模型的 JSON 对象时,create_item 函数会处理该请求。

5. API 文档自动生成

FastAPI 自动为你生成交互式 API 文档,你可以通过以下地址访问:

  • Swagger UI: http://127.0.0.1:8000/docs
  • Redoc: http://127.0.0.1:8000/redoc

这些文档是基于你的路径操作和 Pydantic 模型自动生成的,方便你测试和理解 API。

6. 异步支持

FastAPI 对异步操作提供了良好的支持,你可以通过使用 async def 来定义异步路径操作函数。

python 复制代码
@app.get("/async-items/{item_id}")
async def read_item(item_id: int):
    return {"item_id": item_id}

说明:

  • async def:定义一个异步路径操作,FastAPI 能够自动处理异步请求,使得在处理 I/O 操作(如数据库访问或外部 API 请求)时更高效。

7. 路径操作参数

FastAPI 提供了丰富的路径操作参数,可以通过路径参数、查询参数、请求体、表单数据等传递数据。

7.1. 路径参数
python 复制代码
@app.get("/users/{user_id}/items/{item_id}")
def read_user_item(user_id: int, item_id: int, q: str = None, short: bool = False):
    return {"user_id": user_id, "item_id": item_id, "q": q, "short": short}

说明:

  • 路径参数 user_iditem_id 必须出现在路径中,而 qshort 是可选的查询参数。
7.2. 查询参数

查询参数是路径操作函数的参数,但它们不是路径的一部分。它们在 URL 中使用 ? 后指定。

python 复制代码
@app.get("/items/")
def read_items(q: str = None, limit: int = 10):
    return {"q": q, "limit": limit}

8. 请求体和表单数据

FastAPI 能够处理复杂的请求体数据,使用 Pydantic 模型来进行数据验证。

python 复制代码
@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
    return {"item_id": item_id, **item.dict()}

说明:

  • item: Item:请求体被解析为 Item 类型的实例。

9. 响应模型

你可以使用 Pydantic 模型来定义响应数据的结构,以确保输出的数据符合预期格式。

python 复制代码
from typing import Optional

class ItemResponse(BaseModel):
    name: str
    description: Optional[str] = None
    price_with_tax: float

@app.post("/items/", response_model=ItemResponse)
def create_item(item: Item):
    return ItemResponse(
        name=item.name,
        description=item.description,
        price_with_tax=item.price + (item.tax or 0)
    )

说明:

  • response_model=ItemResponse:指定响应模型为 ItemResponse,FastAPI 会根据这个模型来过滤和验证响应数据。

10. 中间件与依赖注入

FastAPI 支持中间件和依赖注入,使得在请求生命周期的各个阶段执行额外的逻辑成为可能。

10.1. 中间件
python 复制代码
from fastapi.middleware.cors import CORSMiddleware

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

说明:

  • CORSMiddleware 用于处理跨域请求,你可以设置允许的来源、方法和头部。
10.2. 依赖注入
python 复制代码
from fastapi import Depends

def common_parameters(q: str = None, limit: int = 10):
    return {"q": q, "limit": limit}

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

说明:

  • Depends:用于声明依赖,common_parameters 函数的返回值会传递给路径操作函数 read_items

11. 认证与授权

FastAPI 通过 OAuth2、JWT 等机制支持用户认证与授权。

11.1. 简单的 OAuth2 密码流
python 复制代码
from fastapi.security import OAuth2PasswordBearer

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

@app.post("/token")
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
    # 这里应该验证用户并返回 token
    return {"access_token": form_data.username, "token_type": "bearer"}

@app.get("/users/me")
async def read_users_me(token: str = Depends(oauth2_scheme)):
    return {"token": token}

说明:

  • OAuth2PasswordBearer:定义了一个 OAuth2 密码流的认证方案,tokenUrl 指定获取 token 的路径。

总结

FastAPI 是一个强大且高效的框架,适用于构建现代 Web API。它通过类型提示、Pydantic 数据验证和自动生成的文档,极大地提升了开发效率,并支持异步操作、中间件、依赖注入、认证授权等高级特性,非常适合复杂的 Web 应用开发。

相关推荐
Hello-Mr.Wang几秒前
vue3中开发引导页的方法
开发语言·前端·javascript
救救孩子把3 分钟前
Java基础之IO流
java·开发语言
WG_174 分钟前
C++多态
开发语言·c++·面试
宇卿.11 分钟前
Java键盘输入语句
java·开发语言
Amo Xiang21 分钟前
2024 Python3.10 系统入门+进阶(十五):文件及目录操作
开发语言·python
liangbm331 分钟前
数学建模笔记——动态规划
笔记·python·算法·数学建模·动态规划·背包问题·优化问题
friklogff34 分钟前
【C#生态园】提升C#开发效率:深入了解自然语言处理库与工具
开发语言·c#·区块链
B站计算机毕业设计超人42 分钟前
计算机毕业设计Python+Flask微博情感分析 微博舆情预测 微博爬虫 微博大数据 舆情分析系统 大数据毕业设计 NLP文本分类 机器学习 深度学习 AI
爬虫·python·深度学习·算法·机器学习·自然语言处理·数据可视化
羊小猪~~1 小时前
深度学习基础案例5--VGG16人脸识别(体验学习的痛苦与乐趣)
人工智能·python·深度学习·学习·算法·机器学习·cnn
重生之我在20年代敲代码2 小时前
strncpy函数的使用和模拟实现
c语言·开发语言·c++·经验分享·笔记