FastAPI 中的 Query:优化你的数据获取策略

2024-09-03 07:52

本文主要是介绍FastAPI 中的 Query:优化你的数据获取策略,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在 FastAPI 中,Query 是一个依赖项类,用于处理来自 HTTP 请求的查询参数。查询参数是 URL 的一部分,通常用于 GET 请求,它们在 URL 的路径之后,以 ? 开头,参数之间用 & 分隔。例如:http://example.com/api/items?name=foo&age=42

Query 的作用和用途:

  1. 类型声明Query 允许你为查询参数声明一个预期的数据类型,如 strintfloatbool 等。这有助于确保接收到的数据类型正确,并且可以在请求不符合预期时自动生成错误响应。

  2. 默认值:你可以为查询参数指定一个默认值,如果客户端没有提供该参数,就会使用默认值。

  3. 验证Query 可以用于验证传入的数据,例如,检查字符串的长度、数值的范围等。

  4. 文档生成:FastAPI 会自动生成交互式 API 文档(如 Swagger UI),Query 的参数会作为文档的一部分,提供参数的类型、默认值、描述等信息,这有助于 API 的使用者理解如何正确地使用 API。

  5. 依赖注入:在 FastAPI 中,Query 用作依赖注入的一部分,这意味着你可以在路由函数中直接使用它,FastAPI 会处理参数的解析和验证。

Query 的优点:

  1. 自动验证:通过 Query 声明的参数会自动进行类型验证和值验证,如果请求不符合参数的声明,FastAPI 会返回一个清晰的错误响应。

  2. 减少代码冗余:使用 Query 可以减少手动解析和验证查询参数的代码,使得路由函数更加简洁。

  3. 提高安全性:通过声明预期的数据类型和值,Query 有助于防止不安全的或恶意的数据输入。

  4. 增强可读性:在路由函数中使用 Query 可以清晰地表明哪些参数是可选的,哪些是必需的,以及它们的默认值和类型。

  5. 易于维护:当 API 发生变化时,只需更新 Query 的声明即可,无需修改大量的手动解析代码。

  6. 自动文档Query 的参数信息会自动包含在 API 文档中,这对于 API 的测试和文档维护非常有用。

  7. 灵活性Query 支持多种参数选项,如 aliastitledescriptionexamples 等,这些都可以用于增强 API 文档的可读性和易用性。

Query 是 FastAPI 中处理查询参数的强大工具,它通过提供类型安全、自动验证、文档生成和依赖注入等功能,极大地简化了
API 的开发和维护工作。

示例:

FastAPI 路由以接受两个查询参数 qname,你可以在函数签名中定义这两个参数。以下是如何修改你的代码来实现这一点:

from typing import Union
from fastapi import FastAPI, Queryapp = FastAPI()@app.get("/items/")
async def read_items(q: Union[str, None] = Query(default=None, max_length=50), name: str = Query(default="")):results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}if q:results.update({"q": q})if name:results.update({"name": name})return results

在这个例子中,q 参数保持不变,它是一个可选的字符串,可以为 None,并且有一个最大长度限制。name 参数是新添加的,它也是一个可选的字符串,并且默认为空字符串("")。如果客户端在查询中提供了 name 参数,它将被包含在响应中。

如何传值:

  1. 传递 qname 参数:
    请求 URL: /items/?q=some_query&name=JohnDoe
    结果: {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}], "q": "some_query", "name": "JohnDoe"}

  2. 只传递 q 参数:
    请求 URL: /items/?q=some_query
    结果: {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}], "q": "some_query"}

  3. 只传递 name 参数:
    请求 URL: /items/?name=JohnDoe
    结果: {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}], "name": "JohnDoe"}

  4. 不传递任何参数:
    请求 URL: /items/
    结果: {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}

  5. 传递空字符串作为 qname 参数:
    请求 URL: /items/?q=&name=
    结果: {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}], "q": "", "name": ""}

这样,你的 API 端点现在可以灵活地处理两个查询参数,并且可以根据客户端的请求返回相应的数据。

示例二:
作业:

from fastapi import FastAPI, Query
from typing import Union, Literalapp = FastAPI()@app.get("/items/")
async def read_items(q: Union[Literal["true", "false"], None] = Query(default=None, alias="q")):results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}if q:results.update({"q": q})return results

提示

Union[Literal[“true”, “false”], None]
Union:这是 Python 类型提示中的一个特殊类型,表示参数可以接受多种类型中的任意一种。在这里,它表示 q 参数可以是两种类型中的任意一种。
Literal[“true”, “false”]:这是 Python 3.8 引入的一个类型提示,用于指示变量只能是括号中列出的确切字符串字面值。在这个例子中,Literal 指定 q 参数只能是字符串 “true” 或 “false”。
None:表示 q 参数也可以是 None 类型,即不提供该参数。
综合来看,Union[Literal[“true”, “false”], None] 表示 q 参数可以是字符串 “true”、字符串 “false” 或者是 None。

Query(default=None, alias=“q”)
Query:这是 FastAPI 中的一个依赖项类,用于声明一个 HTTP 请求的查询参数。
default=None:这是 Query 的一个参数,指定了当查询参数 q 没有在请求中提供时的默认值。在这个例子中,如果 q 没有被包含在请求中,它的值将默认为 None。
alias=“q”:这是 Query 的另一个参数,用于指定查询参数在 URL 中的实际名称。在这个例子中,即使在函数签名中使用了 alias,查询参数在 URL 中仍然应该使用 “q” 作为键。通常,alias 参数用于在函数参数名和 URL 中的参数名不一致时提供别名,但在这个例子中,它似乎没有改变任何东西,因为别名和参数名相同。

这篇关于FastAPI 中的 Query:优化你的数据获取策略的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1132450

相关文章

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Redis 中的热点键和数据倾斜示例详解

《Redis中的热点键和数据倾斜示例详解》热点键是指在Redis中被频繁访问的特定键,这些键由于其高访问频率,可能导致Redis服务器的性能问题,尤其是在高并发场景下,本文给大家介绍Redis中的热... 目录Redis 中的热点键和数据倾斜热点键(Hot Key)定义特点应对策略示例数据倾斜(Data S

使用Python实现获取网页指定内容

《使用Python实现获取网页指定内容》在当今互联网时代,网页数据抓取是一项非常重要的技能,本文将带你从零开始学习如何使用Python获取网页中的指定内容,希望对大家有所帮助... 目录引言1. 网页抓取的基本概念2. python中的网页抓取库3. 安装必要的库4. 发送HTTP请求并获取网页内容5. 解

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语