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_name
或 book_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路由
处理函数的输入参数,能够方便地对查询参数进行验证和类型转换。
标签:系列,name,04,GET,author,books,params,query,book From: https://blog.csdn.net/weixin_54626591/article/details/139418697