首页 > 编程语言 >python系列:FASTAPI系列 04-GET请求 params参数

python系列:FASTAPI系列 04-GET请求 params参数

时间:2024-06-07 12:29:14浏览次数:10  
标签:系列 name 04 GET author books params query book

FASTAPI系列 04-GET请求 params参数




FASTAPI系列 04-GET请求 params参数

前言

get请求的参数在url后面携带,通常称做query params

一、查询参数

在请求路径后面携带查询参数时,自动解析为查询参数

from pydantic import BaseModel
from fastapi import FastAPI

app = FastAPI()

# 模拟数据库
book_db = [
    {"book_name": "FASTAPI", "book_author": "Teacher Li"},
    {"book_name": "PYTHON", "book_author": "Teacher Li"}
]


# 定义查询参数模型
class BookQueryParams(BaseModel):
    book_name: str | None = None
    book_author: str | None = None


@app.get("/books/")
async def read_books(query_params: BookQueryParams):
    # 过滤数据库中的书籍
    filtered_books = [
        book for book in book_db
        if (query_params.book_name is None or book["book_name"] == query_params.book_name) and
           (query_params.book_author is None or book["book_author"] == query_params.book_author)
    ]

    return filtered_books

/books/ 端点上发送GET请求,并通过查询参数 book_namebook_author 来过滤结果。例如:

查询名为"FASTAPI"的所有书籍:/books/?book_name=FASTAPI

查询作者为""的所有书籍:/books/?book_author=Teacher Li

请求示例

http://127.0.0.1/books/?book_name=FASTAPI

二、参数的默认值

当我们查询参数需要携带分页时,往往都会有默认值,展示当前页与当前页展示的条数;
代码就会修改如下:

from typing import List
from pydantic import BaseModel
from fastapi import FastAPI

app = FastAPI()

# 模拟数据库
book_db = [
    {"book_name": "FASTAPI", "book_author": "<Teacher Li>"},
    {"book_name": "PYTHON", "book_author": "<Teacher Li>"},
    # 假设有很多其他书籍...
]

# 定义查询和分页参数模型
class BookQueryParams(BaseModel):
    book_name: str | None = None
    book_author: str | None = None
    page: int = 1       # 默认当前页为第一页
    page_size: int = 10  # 默认每页显示10条记录

@app.get("/books/")
async def read_books(query_params: BookQueryParams):
    # 计算偏移量(skip)
    skip = (query_params.page - 1) * query_params.page_size

    # 过滤并分页数据库中的书籍
    filtered_books = [
        book for book in book_db
        if (query_params.book_name is None or book["book_name"] == query_params.book_name) and
           (query_params.book_author is None or book["book_author"] == query_params.book_author)
    ]

    # 分页结果
    paginated_books = filtered_books[skip:skip + query_params.page_size]

    return paginated_books

现在,在/books/端点上,您可以使用以下方式发送GET请求

查询所有书籍的第一页(默认):/books/

按书名查询并显示第一页,每页10条:/books/?book_name=FASTAPI

显示第二页,每页10条:/books/?page=2

显示第三页,每页20条:/books/?page=3&page_size=20

三、多路径查询参数

同时声明多个路径参数和查询参数,FASTAPI可以识别它们

from typing import List
from pydantic import BaseModel
from fastapi import FastAPI

app = FastAPI()

# 模拟数据库
book_db = [
    {"book_id": 1, "book_name": "FASTAPI", "book_author": "<Teacher Li>"},
    {"book_id": 2, "book_name": "PYTHON", "book_author": "<Teacher Li>"},
    # 假设有很多其他书籍...
]

# 定义查询和分页参数模型
class BookQueryParams(BaseModel):
    book_name: str | None = None
    book_author: str | None = None
    page: int = 1       # 默认当前页为第一页
    page_size: int = 10  # 默认每页显示10条记录

@app.get("/books/{book_id}/")
async def read_book(book_id: int):
    # 查找指定ID的书籍
    for book in book_db:
        if book["book_id"] == book_id:
            return book
    return {"detail": "Book not found"}

@app.get("/books/")
async def read_books(query_params: BookQueryParams):
    # 计算偏移量(skip)
    skip = (query_params.page - 1) * query_params.page_size

    # 过滤并分页数据库中的书籍
    filtered_books = [
        book for book in book_db
        if (query_params.book_name is None or book["book_name"] == query_params.book_name) and
           (query_params.book_author is None or book["book_author"] == query_params.book_author)
    ]

    # 分页结果
    paginated_books = filtered_books[skip:skip + query_params.page_size]

    return paginated_books

在这个例子中:

我们有一个路径参数book_id,用于获取单本图书详情(/books/{book_id}/)。

另外一个GET路由用于查询图书列表,带有分页和查询参数(/books/)。

当用户访问/books/1/时,将查询并返回ID为1的图书;访问/books/?book_name=FASTAPI&page=2&page_size=20时,将返回按照书名“FASTAPI”过滤的、第二页、每页20条记录的图书列表。

四、查询参数为必填项

from fastapi import FastAPI, Query

@app.get("/books/")
async def read_books(
    book_name: str = Query(..., required=True),
    book_author: str | None = Query(None),
    page: int = 1,
    page_size: int = 10,
):
    # 类似的处理逻辑...

在这种情况下,FastAPI将在接收到没有book_name查询参数的请求时,返回一个HTTP 422错误Unprocessable Entity),指出book_name是必需的。

总结

主要介绍了如何在FastAPI框架中处理和定义GET请求的查询参数(query params),以及如何结合分页和多路径参数进行操作。首先,通过定义一个Pydantic模型来结构化查询参数,并将其作为FastAPI路由处理函数的输入参数,能够方便地对查询参数进行验证和类型转换。







lzq599220

FASTAPI系列 04-GET请求 params参数

标签:系列,name,04,GET,author,books,params,query,book
From: https://blog.csdn.net/weixin_54626591/article/details/139418697

相关文章

  • scanf(),gets(),puts(),fgets()函数的使用
     scanf()scanf按%d输入数字或%s输入字符串时,忽略空格、回车或制表符等空白字符(被作为数据的分隔符) intmain(){ inta=0; intb=0; charc[12]; scanf("%s",&c); printf("c=%s",c); return0;}空格后面的world没有被读进去加一句scanf语句,world被读走了in......
  • Ubuntu22.04 LAMP快速实战
    好的,我来为您详细说明如下步骤:安装LAMP更新软件源并安装必要的软件包:sudoaptupdatesudoaptinstallapache2mysql-serverphplibapache2-mod-phpphp-mysql测试LAMP安装是否成功:访问http://localhost查看Apache默认页面进入/var/www/html目录,创建info.......
  • 打卡信奥刷题(60)用Scratch图形化工具信奥P10424 [普及组] [蓝桥杯 2024 省 B] 好数,写
    [蓝桥杯2024省B]好数题目描述一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位……)上的数字是奇数,偶数位(十位、千位、十万位……)上的数字是偶数,我们就称之为“好数”。给定一个正整数N......
  • 【YOLOv5/v7改进系列】替换上采样层为Dysample
    一、导言介绍了一种名为DySample的超轻量级且高效的动态上采样器。DySample旨在解决当前动态上采样技术如CARAFE、FADE和SAPA虽然性能提升显著但带来大量计算负担的问题,这些问题主要来源于动态卷积的时间消耗以及用于生成动态核的额外子网络。此外,FADE和SAPA需要高分辨率特征......
  • 禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》Chap
    禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》Chapter7插图......
  • 数据库系列16:MyISAM与InnoDB的索引对比
    相关文章数据库系列:MySQL慢查询分析和性能优化数据库系列:MySQL索引优化总结(综合版)数据库系列:高并发下的数据字段变更数据库系列:覆盖索引和规避回表数据库系列:数据库高可用及无损扩容数据库系列:使用高区分度索引列提升性能数据库系列:前缀索引和索引长度的取舍数据库系列:My......
  • 《手把手教你》系列练习篇之12-python+ selenium自动化测试(详细教程)
    1.简介前面文章我们了解了如何获取元素的text属性值,和判断元素是否显示在页面(is_displayed()方法),本文我们来学习下,判断一个控件是否被选中状态、获取页面元素的大小、组合键-全选文字、组合键-退格键删除文本和鼠标右键等练习的内容。2.验证控件是否被选中还是以百度......
  • 《手把手教你》系列练习篇之13-python+ selenium自动化测试 -压轴篇(详细教程)
    1.简介“压轴”原本是戏曲名词,指一场折子戏演出的倒数第二个剧目。在现代社会中有很多应用,比如“压轴戏”,但压轴也是人们知识的一个盲区。“压轴”本意是指倒数第二个节目,而不是人们常说的倒数第一个,倒数第一个节目称“压台”。想看“压台篇”,敬请关注宏哥等待压台篇发......
  • Q12 LeetCode904 水果成篮
    1.使用HashMap记录键值对2.定义HashMap方式HashMap<Integer,Integer>map=newHashMap<>();3.map.put(key,value);输入键值对4.map.getOrDefault(value,0);获取值,如果没有默认为0;5.map.get(key)取值6.map.size()键值对长度7.map.replace(key,value)替换key的value值 ......
  • 前端工程化工具系列(八)——Commitizen(v4.3.0):Git提交规范化工具
    在前端工程化工具系列(四)——Commitlint(v19.3.0):规范化Git提交中曾介绍过commitlint,它主要负责检查提交信息的规范性。而本文中的commitizen,则是提供给了一个交互式的命令行界面,引导开发者按照预定义的格式填写提交信息。它俩的目的都是规范git提交。按照使用习惯......