首页 > 其他分享 >FastAPI 深度指南:使用依赖注入处理分页和过滤逻辑

FastAPI 深度指南:使用依赖注入处理分页和过滤逻辑

时间:2024-09-09 17:23:26浏览次数:11  
标签:分页 parameters FastAPI commons Depends 过滤 参数 函数

在FastAPI框架中,Depends是一个关键的功能,它允许开发者通过依赖注入来管理和重用代码。这在处理API的分页和过滤逻辑时尤其有用,因为它可以将这些逻辑抽象化,从而减少冗余代码并提高效率。

FastAPI 深度指南:使用依赖注入处理分页和过滤逻辑_分页

通过Depends,我们可以定义一个函数,该函数负责获取和验证分页参数(如skiplimit)以及过滤参数(如基于名称或价格的筛选)。

在路由函数中,我们通过Depends将这些参数作为依赖项注入,FastAPI会在调用路由函数之前自动执行这些依赖函数,并将结果作为参数传递给路由函数。这种方式不仅使代码更加模块化,而且使得参数处理逻辑可以在多个路由中重用,从而简化了API的开发和维护。

在下段 Python 代码中,commons 是一个依赖函数 common_parameters 的结果,它通过 FastAPI 的依赖注入系统被传递给路由处理函数。这里的 Annotated 来自 typing 模块,它用于添加额外的类型信息或元数据到已有的类型上,但在 FastAPI 中,它主要用于添加额外的文档信息到参数上。

from typing import Annotated

from fastapi import Depends, FastAPI

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

@app.get("/items/")
async def read_items(commons: Annotated[dict, Depends(common_parameters)]):
    return commons

@app.get("/users/")
async def read_users(commons: Annotated[dict, Depends(common_parameters)]):
    return commons

让我们逐步分析 commons 函数:

  1. common_parameters 是一个异步函数,它接受三个参数:
  • q: 一个可选的字符串,用于搜索或过滤。
  • skip: 一个整数,默认值为 0,用于分页,表示要跳过多少条记录。
  • limit: 一个整数,默认值为 100,用于分页,表示每页显示多少条记录。
  1. common_parameters 函数返回一个字典,包含它接收到的参数。
  2. Annotated[dict, Depends(common_parameters)] 是一个注解,它告诉 FastAPI commons 参数应该通过调用 common_parameters 函数来获取。Depends 是 FastAPI 用于声明依赖的装饰器。
  3. 在路由处理函数 read_itemsread_users 中,commons 参数被用作一个依赖项。这意味着在调用这些函数之前,FastAPI 会自动调用 common_parameters 函数,并将其返回的字典作为 commons 参数的值。
  4. read_itemsread_users 函数简单地返回它们接收到的 commons 字典,这个字典包含了查询参数和分页信息。

在实际应用中,common_parameters 函数可以用来处理来自客户端的通用查询参数

下面是一个简化后的代码示例,它展示了如何在 FastAPI 中使用依赖Depends注入来处理分页和过滤逻辑:

from fastapi import FastAPI, Depends, HTTPException, Query
from typing import List, Optional
from pydantic import BaseModel
from sqlalchemy.orm import Session

# 假设我们有一个数据库会话依赖项
def get_db() -> Session:
    # 这里应该是创建或获取数据库会话的逻辑
    ...

# 定义分页参数的 Pydantic 模型
class Pagination(BaseModel):
    skip: int = Query(default=0, ge=0, description="Number of items to skip")
    limit: int = Query(default=10, gt=0, description="Maximum number of items to return")

# 定义过滤参数的 Pydantic 模型
class Filter(BaseModel):
    name: Optional[str] = Query(None, description="Filter by name")
    price: Optional[float] = Query(None, description="Filter by price")

# 假设我们有一个模型类
class Item(BaseModel):
    id: int
    name: str
    description: str = None
    price: float
    tax: float = None

# 路由处理函数,使用分页和过滤依赖项
@app.get("/items/", response_model=List[Item])
async def read_items(
    db: Session = Depends(get_db),
    pagination: Pagination = Depends(),
    filter: Filter = Depends()
):
    # 应用过滤逻辑
    query = db.query(Item)
    if filter.name:
        query = query.filter(Item.name == filter.name)
    if filter.price:
        query = query.filter(Item.price <= filter.price)  # 使用 <= 以便包含指定价格

    # 应用分页逻辑
    items = query.offset(pagination.skip).limit(pagination.limit).all()
    
    if not items:
        raise HTTPException(status_code=404, detail="Items not found")
    
    return items

通过 curl 发送一个请求体,可以使用以下命令:

curl -X POST "http://localhost:8000/items/" -H "Content-Type: application/json" -d '{"skip": 0, "limit": 5, "name": "example"}'

在这个 curl 命令中:

  • -X POST 指定了请求方法为 POST。
  • -H "Content-Type: application/json" 设置了请求头,告诉服务器我们发送的数据是 JSON 格式。
  • -d '{"skip": 0, "limit": 5, "name": "example"}' 是我们要发送的 JSON 格式的请求体数据。

这样,你就可以通过 curl 命令向 FastAPI 应用发送包含分页和过滤参数的请求体了。

在这个简化的版本中:

  • 我们直接在 PaginationFilter 类中使用了 Query 来定义默认值和从查询参数中获取值。
  • read_items 函数现在直接依赖于 PaginationFilter 类的实例,这些实例会自动从请求的查询参数中获取值。
  • 我们移除了单独的 pagination_parametersfilter_parameters 依赖函数,因为 PaginationFilter 类已经包含了所需的逻辑。
  • Query 函数用于直接从查询参数中获取值,并可以设置默认值和其他验证条件。

这个简化的代码仍然实现了分页和过滤逻辑,同时减少了代码的复杂性。

标签:分页,parameters,FastAPI,commons,Depends,过滤,参数,函数
From: https://blog.51cto.com/u_17005223/11962273

相关文章

  • 推荐系统的基础_协同过滤(CF)
    协同过滤(CollaborativeFiltering)是一种推荐系统算法,它通过分析用户之间的相似性或者物品之间的相似性来预测用户可能感兴趣的物品。协同过滤算法主要有两种类型:1.用户基协同过滤(User-basedCollaborativeFiltering):  这种方法通过找到与目标用户兴趣相似的其他用户,然后......
  • FastAPI模块化:为复杂应用程序提供清晰的结构
    开题描述:在现代软件开发中,随着应用程序规模的扩大和功能的增加,传统的单体架构逐渐暴露出其局限性。FastAPI,作为一款高性能的现代Web框架,通过其模块化设计提供了一种解决方案。本文将探讨FastAPI模块化如何为构建复杂应用程序提供清晰的结构,从而提高代码的可维护性、可扩展性和团队......
  • 构建模块化的FastAPI应用: 从用户认证到角色控制
    实现了用户身份验证及角色授权的基本功能。具体来说,当用户尝试访问某些资源时,系统会首先验证用户的身份,然后根据用户的角色来决定是否允许访问特定资源。例如,普通用户只能访问自己的信息,而管理员可以访问额外的管理界面。这种机制保证了系统的安全性,并且可以根据需要灵活地扩展不同......
  • Linux目录结构进阶和过滤命令(三)
    1.日志查询四剑客注意:查看日志的时候不要用cat或者vim命令,在工作中日志的内容很多,用cat会刷屏,用vim又特别的占用内存,所以我们引出了四条有关查看日志的相关命令1.1四剑客之headhead#显示文件的头几行,默认显示十行head-nnum#显示头num行实例一:显示/etc/passwd的......
  • 深入FastAPI:掌握使用多个关联模型的高级用法
    在构建RESTfulAPI时,经常需要处理复杂的数据关系。FastAPI通过支持多个关联模型,使得定义这些关系变得简单直观。这种方法不仅提高了代码的可维护性,还增强了API的灵活性。通过使用Pydantic库,我们可以轻松定义数据模型及其关联,从而在FastAPI应用中实现强大的数据处理逻辑。无论是一对......
  • 前端必知必会-CSS 分页
    文章目录CSS分页简单分页活动和可悬停分页圆角活动和可悬停按钮可悬停过渡效果带边框的分页圆角边框链接之间的空间分页大小居中分页总结CSS分页简单分页如果您的网站有很多页面,您可能希望为每个页面添加某种分页:示例.pagination{display:inline-block;}......
  • Java计算机毕业设计协同过滤图书(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在信息爆炸的时代,图书资源浩如烟海,读者在浩瀚的书海中寻找自己感兴趣的书籍往往费时费力。传统的图书推荐方式依赖于编辑推荐、畅销书榜单或读者主动......
  • 什么是内存分页和分段
    内存分页和分段是操作系统用于管理内存的一种技术,旨在提高内存的使用效率和安全性。它们各自有不同的结构和目的。1.内存分页(Paging)概述内存分页是一种将物理内存划分为固定大小的块(称为页,通常为4KB)和将逻辑地址空间划分为相同大小的块(称为页表)的机制。分页允许不连续的物理内......
  • PbootCMS实现数字条分页样式效果
    <!--分页-->{pboot:if({page:rows}>0)}<divclass="pagebar"><divclass="pagination"><aclass="page-itempage-linkhidden-sm"href="{page:index}"title="首页">首页</a&......
  • WIFI空口包在Wireshark中过滤条件
    一)三大类WIFI包过滤wlan.fc.type==0管理帧wlan.fc.type==1控制帧wlan.fc.type==2数据帧二)管理帧AssociationReq/Rspwlan.fc.type_subtype==0x0000||wlan.fc.type_subtype==0x0001ReassociationReq/Rspwlan.fc.type_subtype==0x00002||wlan.fc.type......