首页 > 其他分享 >三周精通FastAPI:6 路径参数和数值校验

三周精通FastAPI:6 路径参数和数值校验

时间:2024-10-22 21:49:11浏览次数:9  
标签:三周 FastAPI 校验 results item items Path id

路径参数和数值校验

与使用 Query 为查询参数声明更多的校验和元数据的方式相同,你也可以使用 Path 为路径参数声明相同类型的校验和元数据。

导入 路径Path

首先,从 fastapi 导入 Path

from typing import Annotated

from fastapi import FastAPI, Path, Query

app = FastAPI()


@app.get("/items/{item_id}")
async def read_items(
    item_id: Annotated[int, Path(title="The ID of the item to get")],
    q: Annotated[str | None, Query(alias="item-query")] = None,
):
    results = {"item_id": item_id}
    if q:
        results.update({"q": q})
    return results

声明元数据

你可以声明与 Query 相同的所有参数。例如,要声明路径参数 item_id的 title 元数据值,你可以输入:

async def read_items(
    item_id: Annotated[int, Path(title="The ID of the item to get")],
    q: Annotated[str | None, Query(alias="item-query")] = None,
):

Note

路径参数总是必需的,因为它必须是路径的一部分。

所以,你应该在声明时使用 ... 将其标记为必需参数。

然而,即使你使用 None 声明路径参数或设置一个其他默认值也不会有任何影响,它依然会是必需参数。

按需对参数排序

假设你想要声明一个必需的 str 类型查询参数 q

而且你不需要为该参数声明任何其他内容,所以实际上你并不需要使用 Query

但是你仍然需要使用 Path 来声明路径参数 item_id

如果你将带有「默认值」的参数放在没有「默认值」的参数之前,Python 将会报错。

但是你可以对其重新排序,并将不带默认值的值(查询参数 q)放到最前面。

对 FastAPI 来说这无关紧要。它将通过参数的名称、类型和默认值声明(QueryPath 等)来检测参数,而不在乎参数的顺序。因此,你可以将函数声明为:

from fastapi import FastAPI, Path

app = FastAPI()


@app.get("/items/{item_id}")
async def read_items(q: str, item_id: int = Path(title="The ID of the item to get")):
    results = {"item_id": item_id}
    if q:
        results.update({"q": q})
    return results

此代码为不使用 Annotated (from typing import Annotated)的python3.8版本。

按需对参数排序的技巧

如果你想不使用 Query 声明没有默认值的查询参数 q,同时使用 Path 声明路径参数 item_id,并使它们的顺序与上面不同,Python 对此有一些特殊的语法。

传递 * 作为函数的第一个参数。Python 不会对该 * 做任何事情,但是它将知道之后的所有参数都应作为关键字参数(键值对),也被称为 kwargs,来调用。即使它们没有默认值。

from fastapi import FastAPI, Path

app = FastAPI()


@app.get("/items/{item_id}")
async def read_items(*, item_id: int = Path(title="The ID of the item to get"), q: str):
    results = {"item_id": item_id}
    if q:
        results.update({"q": q})
    return results

数值校验:大于等于

使用 Query 和 Path(以及你将在后面看到的其他类)可以声明字符串约束,但也可以声明数值约束。像下面这样,添加 ge=1 后,item_id 将必须是一个大于(greater than)或等于(equal)1的整数。

from fastapi import FastAPI, Path

app = FastAPI()


@app.get("/items/{item_id}")
async def read_items(
    *, item_id: int = Path(title="The ID of the item to get", ge=1), q: str
):
    results = {"item_id": item_id}
    if q:
        results.update({"q": q})
    return results

数值校验:大于和小于等于

同样的规则适用于:

  • gt:大于(greater than)
  • le:小于等于(less than or equal)
from fastapi import FastAPI, Path

app = FastAPI()


@app.get("/items/{item_id}")
async def read_items(
    *,
    item_id: int = Path(title="The ID of the item to get", gt=0, le=1000),
    q: str,
):
    results = {"item_id": item_id}
    if q:
        results.update({"q": q})
    return results

数值校验:浮点数、大于和小于

数值校验同样适用于 float 值。

能够声明 gt 而不仅仅是 ge 在这个前提下变得重要起来。例如,你可以要求一个值必须大于 0,即使它小于 1

因此,0.5 将是有效值。但是 0.0或 0 不是。对于 lt 也是一样的。

from fastapi import FastAPI, Path, Query

app = FastAPI()


@app.get("/items/{item_id}")
async def read_items(
    *,
    item_id: int = Path(title="The ID of the item to get", ge=0, le=1000),
    q: str,
    size: float = Query(gt=0, lt=10.5),
):
    results = {"item_id": item_id}
    if q:
        results.update({"q": q})
    if size:
        results.update({"size": size})
    return results

总结

你能够以与 查询参数和字符串校验 相同的方式使用 QueryPath(以及其他你还没见过的类)声明元数据和字符串校验。

而且你还可以声明数值校验:

  • gt:大于(greater than)
  • ge:大于等于(greater than or equal)
  • lt:小于(less than)
  • le:小于等于(less than or equal)

Info

QueryPath 以及你后面会看到的其他类继承自一个共同的 Param 类(不需要直接使用它)。

而且它们都共享相同的所有你已看到并用于添加额外校验和元数据的参数。

"技术细节"

当你从 fastapi 导入 QueryPath 和其他同类对象时,它们实际上是函数。

当被调用时,它们返回同名类的实例。

如此,你导入 Query 这个函数。当你调用它时,它将返回一个同样命名为 Query 的类的实例。

因为使用了这些函数(而不是直接使用类),所以你的编辑器不会标记有关其类型的错误。

这样,你可以使用常规的编辑器和编码工具,而不必添加自定义配置来忽略这些错误。

实践

Path

代码:

from typing import Annotated

from fastapi import FastAPI, Path, Query

app = FastAPI()


@app.get("/items/{item_id}")
async def read_items(
    item_id: Annotated[int, Path(title="The ID of the item to get")],
    q: Annotated[str | None, Query(alias="item-query")] = None,
):
    results = {"item_id": item_id}
    if q:
        results.update({"q": q})
    return results

启动服务:

uvicorn path:app --reload

 测试链接

链接: http://127.0.0.1:8000/items/str

输出

{"detail":[{"type":"int_parsing","loc":["path","item_id"],"msg":"Input should be a valid integer, unable to parse string as an integer","input":"str"}]}

链接:http://127.0.0.1:8000/items/555?item-query=100

输出:

{"item_id":555,"q":"100"}

 按需对参数排序

代码

from fastapi import FastAPI, Path

app = FastAPI()


@app.get("/items/{item_id}")
async def read_items(*, item_id: int = Path(title="The ID of the item to get"), q: str):
    results = {"item_id": item_id}
    if q:
        results.update({"q": q})
    return results

链接:http://127.0.0.1:8000/items/555?q=hello 

输出:

{"item_id":555,"q":"hello"}

数值校验

代码

from fastapi import FastAPI, Path, Query

app = FastAPI()


@app.get("/items/{item_id}")
async def read_items(
    *,
    item_id: int = Path(title="The ID of the item to get", ge=0, le=1000),
    q: str,
    size: float = Query(gt=0, lt=10.5),
):
    results = {"item_id": item_id}
    if q:
        results.update({"q": q})
    if size:
        results.update({"size": size})
    return results

链接:http://127.0.0.1:8000/items/555?q=hello&size=0.4 

输出:{"item_id":555,"q":"hello","size":0.4}

 链接:http://127.0.0.1:8000/items/555?q=hello&size=21

输出:{"detail":[{"type":"less_than","loc":["query","size"],"msg":"Input should be less than 10.5","input":"21","ctx":{"lt":10.5}}]}

总结:

路径参数和数值校验实在太好用了!可以直接在声明参数的时候就进行定义,软件内部自动检验,省去了很多麻烦,实在太棒了!

标签:三周,FastAPI,校验,results,item,items,Path,id
From: https://blog.csdn.net/skywalk8163/article/details/143099248

相关文章

  • 三周精通FastAPI:7 查询参数模型
    查询参数模型如果你有一组相关的查询参数,你可以创建一个Pydantic模型来声明它们。这将允许您在多个地方重用模型,并一次声明所有参数的验证和元数据。......
  • iOS - Swift 正则校验场景总结
    1.校验是否只含有“数字和字母”或者“字母”classfunccheckUserName(_username:String)->Bool{    letregex=try?NSRegularExpression(pattern:"^(?![0-9]+$)[0-9A-Za-z]{8,16}$",options:[])    returnregex?.firstMatch(in:usernam......
  • 在Windows操作系统中,配置系统服务和检查服务的状态是确保系统正常运行的关键步骤。以
    在Windows操作系统中,配置系统服务和检查服务的状态是确保系统正常运行的关键步骤。以下是关于系统服务、PrintSpooler服务的工作状态、身份增强校验失败和Guest账户未激活的详细说明:1.系统服务概述Windows系统服务是后台运行的程序,用于执行系统管理任务或支持应用程序的运行。......
  • JAVA拦截器配合JWT、ThreadLocal的登录校验
    @TOC拦截器配合JWT、ThreadLocal的登录校验关于为什么要写这篇文章,今天在做项目的时候发现配置了拦截器,但是不生效,最后排查半天发现引入包有问题,遂决定写一篇详细的拦截器的使用。举例也都是根据案例写的,可能会有些许阅读困难,这里面的示例的TOKEN是在请求头里面的。使用......
  • SSM国际物流航空运输管理rd982 验证码校验登录
    开题报告内容一、选题背景及意义随着全球化和信息化的发展,国际物流行业迎来了前所未有的发展机遇。航空运输作为国际物流的重要组成部分,具有速度快、效率高的特点,对于满足现代企业对物流时效性的需求具有重要意义。SSM国际物流航空运输管理rd982项目旨在通过开发一套基于SSM......
  • 2024-2025-1 20231309《计算机基础与程序设计》第三周助教总结
    课程答疑最近同学们的提问大多都是与虚拟机、Linux命令有关,往往是在具体操作上出现了未曾意料的报错。而出现此类问题的主要原因包括:操作不规范,如Linux命令输入不准确等解决方案:出现报错后首先检查自己输入的命令是否准确无误,例如是否少空格少参数等,再看是否有缺漏步骤等。......
  • PBOOTCMS后台出现 登入失败:表单提交校验失败,刷新后重试
    根据你的描述,问题可能是由于缓存文件导致的。以下是详细的解决步骤和解释:1.问题现象错误信息:“登入失败:表单提交校验失败,刷新后重试”背景:前一天还正常,程序无被黑痕迹,数据库账号密码正常,服务器环境未更改。2.解决步骤删除 runtime 文件夹:路径:根目录下的 r......
  • 三周精通FastAPI:1 第一步入门
    FastAPI是一个非常棒的pythonweb和api框架,准备用三周的时间“精通它”学习流程参考FastAPI官网的用户教程:教程-用户指南-FastAPI 学前提示运行代码¶所有代码片段都可以复制后直接使用(它们实际上是经过测试的Python文件)。要运行任何示例,只需将代码复制到 main.p......
  • 三周精通FastAPI:2 路径参数以及声明路径参数的类型
    路径参数¶FastAPI支持使用Python字符串格式化语法声明路径参数(变量):fromfastapiimportFastAPIapp=FastAPI()@app.get("/items/{item_id}")asyncdefread_item(item_id):return{"item_id":item_id}这段代码把路径参数 item_id 的值传递给路径函数的......
  • 【FastAPI】异步+网络请求
    前言:当我们碰到IO阻塞的时,使用fastapi异步框架,需要配合异步模块使用1.网络请求,httpximporthttpximportuvicornfromfastapiimportFastAPIfromfastapi.requestsimportRequestapp=FastAPI()@app.get("/api")asyncdefapi(request:Request):data_dict=......