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

相关文章

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变