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路由处理函数的输入参数,能够方便地对查询参数进行验证和类型转换。

更多内容,请扫码关注公众号

在这里插入图片描述

  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 使用FastAPI和Redis来获取session,可以按照以下步骤进行操作: 1. 首先,安装所需的库。使用pip命令安装FastAPIfastapi_session库,以及aioredis库。 2. 创建一个FastAPI应用程序,并导入所需的库和模块。 ```python from fastapi import FastAPI from fastapi_session import SessionMiddleware import aioredis ``` 3. 初始化FastAPI应用程序和Redis连接。 ```python app = FastAPI() redis = await aioredis.create_connection("redis://localhost:6379") ``` 4. 添加SessionMiddleware中间件到FastAPI应用程序中。 ```python app.add_middleware(SessionMiddleware, secret_key="your-secret-key", redis_instance=redis) ``` 在上述代码中,需要将"your-secret-key"替换为一个随机生成的密钥,用于对会话数据进行加密。 5. 创建一个路由,用于访问和操作session数据。 ```python @app.get("/session") async def get_session(session=Depends(get_session_manager)): return session["data"] ``` 上述代码中的"get_session_manager"是一个自定义的依赖项函数,用于获取session管理器。 6. 启动FastAPI应用程序。 ```python if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000) ``` 现在,您可以使用FastAPI和Redis来获取session。当访问/session路由时,将返回session中存储的数据。您可以使用其他路由来设置、更新或删除session数据。请根据您的具体需求进行相应的操作。 ### 回答2: fastapi-redis-session 是一个用于获取 session 的 FastAPI 插件。它基于 Redis 数据库实现了会话管理,并提供了一种简单的方式来存储和获取会话数据。 为了使用 fastapi-redis-session,首先需要安装并导入 fastapi 和 redis 相关的库。然后,创建一个 FastAPI 应用程序,并使用 fastapi-redis-session 插件初始化会话管理。 通过 fastapi-redis-session,可以使用 `request.session` 来访问会话对象。会话对象有一个 `get` 方法,用于从会话中获取数据。例如,可以通过 `request.session.get('username')` 获取会话中的用户名。 如果需要设置会话数据,可以使用会话对象的 `__setitem__` 方法,用于将数据写入会话。例如,可以通过 `request.session['username'] = 'John'` 将用户名存储到会话中。 此外,还可以使用会话对象的 `delete` 方法,用于从会话中删除数据。例如,可以通过 `request.session.delete('username')` 删除会话中的用户名。 要注意的是,fastapi-redis-session 还提供了其他一些功能,如设置会话过期时间、使用不同的 Redis 配置和使用自定义的会话 ID。 总体而言,fastapi-redis-session 为 FastAPI 应用程序提供了一种简单而强大的方式来管理会话。通过使用该插件,可以轻松地获取、存储和操作会话数据,从而提高应用程序的用户体验和功能扩展性。 ### 回答3: FastAPI-Redis-Session 是一个通过 Redis 存储会话数据的 FastAPI 插件。要获取 session,首先需要安装和配置 FastAPI-Redis-Session 插件。 步骤如下: 1. 首先确保已安装 FastAPIFastAPI-Redis-Session 插件。可以使用 pip 进行安装: ``` pip install fastapi fastapi-redis-session ``` 2. 在 FastAPI 应用程序中导入 FastAPI-Redis-Session: ```python from fastapi_redis_session import SessionMiddleware from fastapi import FastAPI ``` 3. 创建 FastAPI 应用程序并添加中间件: ```python app = FastAPI() app.add_middleware(SessionMiddleware, secret_key="your-secret-key", expire_seconds=3600, redis_url="redis://localhost:6379") ``` 4. 在路由函数中,可以通过访问 `request.session` 来获取 session 对象,然后对其进行操作: ```python from fastapi import Request @app.get("/example") def example(request: Request): session = request.session # 获取 session 数据 data = session.get("key") # 设置 session 数据 session["key"] = "value" ``` 在上述示例中,我们首先从请求对象 `request` 中获取 `session` 对象,然后可以使用 `get()` 方法来获取 session 中的数据,或者使用字典的方式设置或修改 session 数据。 需要注意的是,在添加中间件时,我们需要提供一个密钥(`secret_key`)用于对 session 数据进行加密,过期时间(`expire_seconds`)用于定义 session 的过期时间,以及 Redis 的 URL 地址(`redis_url`)。 以上就是使用 FastAPI-Redis-Session 插件来获取 session 的简要步骤和示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值