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

news2024/11/14 4:01:20

在FastAPI框架中,Depends是一个关键的功能,它允许开发者通过依赖注入来管理和重用代码。这在处理API的分页和过滤逻辑时尤其有用,因为它可以将这些逻辑抽象化,从而减少冗余代码并提高效率。
在这里插入图片描述
通过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,用于分页,表示每页显示多少条记录。
  2. common_parameters 函数返回一个字典,包含它接收到的参数。

  3. Annotated[dict, Depends(common_parameters)] 是一个注解,它告诉 FastAPI commons 参数应该通过调用 common_parameters 函数来获取。Depends 是 FastAPI 用于声明依赖的装饰器。

  4. 在路由处理函数 read_itemsread_users 中,commons 参数被用作一个依赖项。这意味着在调用这些函数之前,FastAPI 会自动调用 common_parameters 函数,并将其返回的字典作为 commons 参数的值。

  5. 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 函数用于直接从查询参数中获取值,并可以设置默认值和其他验证条件。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2122060.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

优质设计素材网站推荐,助力创意设计

在设计工作中&#xff0c;优质的设计素材能够极大提升作品的质量和效率。无论是图标、插画、字体&#xff0c;还是配色方案&#xff0c;一个强大的素材库可以为设计师的创作提供无限的可能性。然而&#xff0c;面对互联网中海量的设计资源&#xff0c;找到适合自己需求的网站并…

Vue+SpringBoot+数据库整体开发流程 1

本篇文章通过springboot整合mybatis-plus去实现后端对数据库的增删改查&#xff0c;以及响应给前端的url&#xff0c;让前端获得数据。 目录 一、简单搭建一个Vue项目 检查node.js版本 使用vue-cli创建空项目 Vue-cli工程中每个文件夹和文件的用处 二、Mysql数据库 创建数…

全网最全的软件测试面试题(含文档)

1、你以前工作时的测试流程是什么&#xff1f; 参考答案&#xff1a;&#xff08;灵活回答&#xff09; 公司对测试流程没有规定如何做&#xff0c;但每个测试人员都有自己的一套测试流程。我说下我1年来不断改正&#xff08;自己总结&#xff0c;吸取同行的方法&#xff09;…

7.测试用例设计方法 + Bug

一、正交实验法 1.使用场景 因果关系比较庞大的情况下&#xff0c;不太适合用因果图判定表&#xff0c;在这种情况下&#xff0c;一般会采用正交实验法。 2.例子&#xff1a; 字符属性设置&#xff08;4个条件&#xff09; 字体很多 字符样式很多 …

高颜值官网(2):12个小家电网站UI,这是火辣辣的美呀。

小家电网站的设计应该注重简洁、清晰和易用。以下是一些设计建议&#xff1a; 1. 清晰的导航&#xff1a;网站应该有清晰的导航菜单&#xff0c;让用户能够轻松找到他们需要的产品或信息。 2. 产品展示&#xff1a;网站应该有清晰的产品展示页面&#xff0c;包括高质量的产品…

Spring Boot 框架下的房屋租赁业务创新

第2章 技术介绍 2.1 相关技术 房屋租赁系统是在JSP MySQL开发环境的基础上开发的。JSP是一种服务器端脚本语言&#xff0c;易于学习&#xff0c;实用且面向用户。全球超过35&#xff05;的JSP驱动的互联网站点使用JSP。MySQL是一个数据库管理系统&#xff0c;因为它的体积小但…

【MySQL】数据库的操作【字符集和校验规则】【对数据库进行操作】【数据库备份与恢复】

目录 库的操作1.创建数据库2.字符集和校验规则2.1 查看系统默认字符集以及校验规则2.2查看支持的字符集2.3查看支持的字符集校验规则2.4 校验规则对数据库的影响 3.对数据库进行操作3.1查看数据库3.2显示数据库3.3修改数据库3.4删除数据库3.5备份与恢复(重要)3.5.1注意事项 3.6…

【python2C】1. 输入 (补)

基础的前文已备&#xff0c;不再赘述。 这里举两类特别的题。 1.矩阵题 输入 第一行为正整数n 第二行开始的n行&#xff0c;连续n个字符&#xff0c;代表不同的意义&#xff0c;无间隔字符&#xff01; Python nint(input()) data[input().split("") for _ in rang…

[数据集][目标检测]乱堆物料检测数据集VOC+YOLO格式1143张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1143 标注数量(xml文件个数)&#xff1a;1143 标注数量(txt文件个数)&#xff1a;1143 标注…

SSD学习内容记录

什么是ssd 固态硬盘 (SSD) 是基于半导体的 存储设备 &#xff0c;依靠 闪存 在计算机系统中存储持久数据。在 SSD 中&#xff0c;每个内存芯片均由包含内存单元&#xff08;也称为页或扇区&#xff09;的块构建而成&#xff0c;而内存单元又包含内存位。与使用磁铁存储数据的磁…

【PX4-AutoPilot教程-TIPS】PX4飞控Gazebo仿真去除asphalt沥青地面

PX4飞控Gazebo仿真去除asphalt沥青地面 环境&#xff1a; Ubuntu &#xff1a;20.04 LTS PX4 &#xff1a;1.13.0 在使用PX4飞控进行仿真测试时&#xff0c;默认的Gazebo仿真环境通常会包含一个沥青地面&#xff08;asphalt plane&#xff09;。然而&#xff0c;在某些特定测…

interface 原来是这样用的呀 ?typescript入门指南05(持续更新中)

大家好&#xff0c;我是王天~ 这篇文章是 ts入门指南系列中第5篇&#xff0c;主要讲解ts中的interface接口应用&#xff0c;接口在ts中是比较重要的功能、兼顾类型的约束和拓展 ts 入门指南系列 Ts vs Js 谁适合前端开发&#xff1f; | TypeScript 入门指南 01详解 tsconfig.j…

【AIGC】InstructPixPix:基于文本引导的图像编辑技术

github:diffusers/examples/instruct_pix2pix/train_instruct_pix2pix_sdxl.py at main huggingface/diffusers GitHub 论文&#xff1a;https://arxiv.org/pdf/2211.09800 摘要 我们提出了一种从人类指令编辑图像的方法&#xff1a;给定一个输入图像和告诉模型做什么的书面…

往年互联网大厂腾讯华为百度等校招面试笔试题合集

踏入互联网巨头的第一步&#xff0c;从征服这份笔试真题集开始&#xff01;小编搜集了多家顶尖互联网企业的历年校招面试笔试题&#xff0c;从基础扎实的数据结构与算法&#xff0c;到考验创新能力的产品设计案例&#xff0c;再到紧跟时代脉搏的前沿科技问答&#xff0c;全方位…

【笔记】扩散模型(七):Latent Diffusion Models(Stable Diffusion)论文解读与代码实现

论文链接&#xff1a;High-Resolution Image Synthesis with Latent Diffusion Models 官方实现&#xff1a;CompVis/latent-diffusion、CompVis/stable-diffusion 这一篇文章的内容是 Latent Diffusion Models&#xff08;LDM&#xff09;&#xff0c;也就是大名鼎鼎的 Stable…

HarmonyOS开发之Swiper的使用(跳转到指定索引的方法)

一&#xff0c;效果图 class MyDataSource implements IDataSource {private list: number[] []private listener: DataChangeListenerconstructor(list: number[]) {this.list list}totalCount(): number {return this.list.length}getData(index: number): any {return thi…

svg图标的使用

图片的格式有很多&#xff0c;前端经常使用的有以下类型:jpg,jpeg,png,gif,svg,这篇文章将简单svg的情况&#xff0c;以及项目中如何使用和配置svg图标 目录 什么是svg图标 SVG图标的优缺点 优点 缺点 svg前端使用场景 SVG在代码中的使用 简单使用创建svg 作为图标引入…

注册网站怎么注册

网站注册成为我们日常生活中不可或缺的一部分。无论是社交媒体、电子商务平台还是各种在线服务&#xff0c;注册都是参与这些平台的第一步。下面将为您详细介绍一般网站注册的步骤&#xff0c;帮助您轻松完成注册过程。 1. 选择合适的网站 在注册之前&#xff0c;首先要确定您…

使用kubeadm部署k8s集群

1、简介 K8s部署主要有两种方式&#xff1a; 1、Kubeadm Kubeadm是一个K8s部署工具&#xff0c;提供kubeadm init和kubeadm join&#xff0c;用于快速部署Kubernetes集群。 2、二进制 从github下载发行版的二进制包&#xff0c;手动部署每个组件&#xff0c;组成Kubernetes集…

通过 汇编 分析 结构体

不使用结构体的情况&#xff0c; 网上的资料&#xff1a; 使用结构体的情况 总结 ; 使用 结构体之后&#xff0c; 会节省汇编的 ldr 指令&#xff0c; 结构体 就直接使用 偏移量 来 对变量进行赋值了。 注意 &#xff1a; 这里 结构体 依然是一个全局变量。