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 应用开发。

相关推荐
Theodore_10223 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
网易独家音乐人Mike Zhou3 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
安静读书3 小时前
Python解析视频FPS(帧率)、分辨率信息
python·opencv·音视频
----云烟----5 小时前
QT中QString类的各种使用
开发语言·qt
lsx2024065 小时前
SQL SELECT 语句:基础与进阶应用
开发语言
小二·5 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic5 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
向宇it5 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
武子康5 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神6 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式