首页 > 其他分享 >FastAPI 路径参数详解:动态路径与数据校验的灵活实现

FastAPI 路径参数详解:动态路径与数据校验的灵活实现

时间:2024-11-03 16:45:12浏览次数:6  
标签:name FastAPI 路径 校验 item model id

FastAPI 路径参数详解:动态路径与数据校验的灵活实现

本文全面介绍了在 FastAPI 中使用路径参数的技巧和实现方式。路径参数允许 API 动态响应不同路径中的请求信息,结合 URL(Uniform Resource Locator)和 URI(Uniform Resource Identifier)进行资源定位和标识。URL 是指资源的完整访问路径,用于确定资源的具体位置,而 URI 则是更广义的概念,包含 URL,在 URL 的基础上提供对特定资源的唯一标识。文中通过类型声明实现了路径参数的数据转换与校验,确保路径中的参数符合预期格式。本文还展示了路径参数类型、数据校验、路径操作顺序和 Enum 类型的使用,提供了定义固定值路径参数的示例。此外,文章解释了如何声明包含文件路径的路径参数,并提供了具体的代码示例,是学习 FastAPI 路径参数与资源标识的实用指南。

文章目录

一 路径参数

在 FastAPI 中,路径参数通过在路径字符串中包含变量来定义。路径参数用于接收请求 URL 中的动态部分,使得 API 可以根据不同的路径值响应不同的内容。具体来说,路径参数在路径中通过花括号来标识,并在相应的函数参数中进行定义和使用。例如,在路径 /items/{item_id} 中,{item_id} 就是路径参数。

1 示例

以下是一个简单的示例代码:

from fastapi import FastAPI

app = FastAPI()

@app.get("/items/{item_id}")
async def read_item(item_id):
    return {"item_id": item_id}

在这个例子中,路径参数 item_id 的值会被传递给路径操作函数的参数 item_id。可以运行代码文件 chapter02.py 来启动应用:

$ uvicorn chapter02:app --reload

访问自动生成的 API 文档 Swagger UI:http://127.0.0.1:8000/docs。通过访问 http://127.0.0.1:8000/items/foo,可以获得如下返回:

{"item_id": "foo"}
2 路径参数类型

在以下代码中,item_id 的类型声明为 int

from fastapi import FastAPI

app = FastAPI()

@app.get("/items02/{item_id}")
async def read_item(item_id: int):
    return {"item_id": item_id}
3 数据转换

FastAPI 可以通过类型声明自动解析请求中的数据并进行数据转换。例如,路径 /items/3 中的字符串 3 会被自动转换为整数 3

4 数据校验

FastAPI 使用 Python 类型声明来实现数据校验。如果请求中的值与声明的类型不匹配,将返回错误信息。例如,对于 async def read_item(item_id: int),当请求路径为 /items/foo 时,返回的错误信息如下:

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

在 FastAPI 中,数据校验由 Pydantic 实现。

二 路径操作的顺序

路径操作按定义顺序依次运行。如果一个 URI 既与特定路径匹配,又与包含路径参数的路径匹配,应将特定路径的操作放在前面,包含路径参数的路径写在后面。例如:

from fastapi import FastAPI

app = FastAPI()

@app.get("/users/me")
async def read_user_me():
    return {"user_id": "the current user"}

@app.get("/users/{user_id}")
async def read_user(user_id: str):
    return {"user_id": user_id}

注意/users/me 必须在 /users/{user_id} 之前声明,否则 /users/{user_id} 将匹配 /users/me,并将 me 作为 user_id 的值。

三 使用 Enum 类型预定义路径参数的值

可以使用 Python 的 Enum 类型来预定义路径参数的值。

from enum import Enum
from fastapi import FastAPI

class ModelName(str, Enum):
    alexnet = "alexnet"
    resnet = "resnet"
    lenet = "lenet"

app = FastAPI()

@app.get("/models/{model_name}")
async def get_model(model_name: ModelName):
    if model_name is ModelName.alexnet:
        return {"model_name": model_name, "message": "Deep Learning FTW!"}
    if model_name.value == "lenet":
        return {"model_name": model_name, "message": "LeCNN all the images"}
    return {"model_name": model_name, "message": "Have some residuals"}

使用 Enum 类(ModelName)可以为路径参数 model_name 设置类型注解。

1 比较枚举元素
if model_name is ModelName.alexnet:
2 获取枚举值
model_name.value

ModelName.lenet.value
3 返回枚举元素
return {"model_name": model_name, "message": "Have some residuals"}

请求访问 http://127.0.0.1:8000/models/resnet 时,客户端将收到如下 JSON 响应:

{
  "model_name": "resnet",
  "message": "Have some residuals"
}

四 包含文件路径的路径参数

可以直接使用 Starlette 的选项声明包含路径路径参数

/files/{file_path:path}

在这个示例中,参数名为 file_path,结尾部分的 :path 表示该参数应匹配整个路径。例如,包含 /home/your/myfile.txt 的路径参数必须以斜杠(/)开头。在这个例子中,URI 为 /files//home/your/myfile.txtfileshome 之间需要使用双斜杠//)。

:OpenAPI 不支持声明包含路径的路径参数,因此访问 /files/{file_path} 时可能会报错 {"detail": "Not Found"}

五 完整代码示例

from fastapi import FastAPI
from enum import Enum

app = FastAPI()


@app.get("/items/{item_id}")
async def read_item(item_id):
    return {"item_id": item_id}


@app.get("/items02/{item_id}")
async def read_item(item_id: int):
    return {"item_id": item_id}


@app.get("/users/me")
async def read_user_me():
    return {"user_id": "the current user"}


@app.get("/users/{user_id}")
async def read_user(user_id: str):
    return {"user_id": user_id}


class ModelName(str, Enum):
    alexnet = "alexnet"
    resnet = "resnet"
    lenet = "lenet"


@app.get("/models/{model_name}")
async def get_model(model_name: ModelName):
    if model_name is ModelName.alexnet:
        return {"model_name": model_name, "message": "Deep Learning FTW!"}

    if model_name.value == "lenet":
        return {"model_name": model_name, "message": "LeCNN all the images"}

    return {"model_name": model_name, "message": "Have some residuals"}


@app.get("/files/{file_path:path}")
async def read_file(file_path: str):
    return {"file_path": file_path}

六 源码地址

详情见:GitHub FastApiProj

引用: FastAPI 文档

标签:name,FastAPI,路径,校验,item,model,id
From: https://blog.csdn.net/u014394049/article/details/143436418

相关文章

  • 三周精通FastAPI:19 Body - Updates 请求体 - 更新数据
    官网文档:https://fastapi.tiangolo.com/zh/tutorial/body-updates/请求体-更新数据¶用 PUT 更新数据¶更新数据请用 HTTP PUT 操作。把输入数据转换为以JSON格式存储的数据(比如,使用NoSQL数据库时),可以使用 jsonable_encoder。例如,把 datetime 转换为 str。......
  • 三周精通FastAPI:20 Dependencies 依赖项 和类作为依赖项
    官方文档:依赖项-FastAPI依赖项¶FastAPI提供了简单易用,但功能强大的依赖注入系统。这个依赖系统设计的简单易用,可以让开发人员轻松地把组件集成至 FastAPI。什么是「依赖注入」¶编程中的「依赖注入」是声明代码(本文中为路径操作函数 )运行所需的,或要使用的「依赖」......
  • 易语言模拟真人动态生成鼠标滑动路径
    一.简介鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。鼠标轨迹算法的底层实现采用C/C++语言,原因在于C/C++提供了高性能的执行能力和直接访问操作系统底层资源的能力。鼠标轨迹算法具有以下优势:模拟人工轨迹:算法能够模拟出非贝塞尔曲线的......
  • Python模拟真人动态生成鼠标滑动路径
    一.简介鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。鼠标轨迹算法的底层实现采用C/C++语言,原因在于C/C++提供了高性能的执行能力和直接访问操作系统底层资源的能力。鼠标轨迹算法具有以下优势:模拟人工轨迹:算法能够模拟出非贝塞尔曲线的......
  • C++模拟真人动态生成鼠标滑动路径
    一.简介鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。鼠标轨迹算法的底层实现采用C/C++语言,原因在于C/C++提供了高性能的执行能力和直接访问操作系统底层资源的能力。鼠标轨迹算法具有以下优势:模拟人工轨迹:算法能够模拟出非贝塞尔曲线的......
  • 欧拉路径 & 欧拉回路
    欧拉路径代码细节较多link欧拉回路中国邮递员问题求从点\(s\)出发,遍历所有边,最后回到\(s\)的最短路线考虑回路的性质:每个点的度都为偶数那么只需要求将奇度点两两配对的最小代价即可(算法?P6628[省选联考2020B卷]丁香之路把起点和终点连一条边,则转化为上面这个问题......
  • 动态规划 —— 路径问题-地下城游戏
    1. 地下城游戏题目链接:174.地下城游戏-力扣(LeetCode)https://leetcode.cn/problems/dungeon-game/description/ 2. 算法原理 状态表示:以莫一个位置位置为结尾或者以莫一个位置为起点  dp[i,j]表示:到达[i,j]位置的时候,骑士所需要的最低初始健康点数(X),这个状......
  • 短视频整套源码,如何实现幂等性校验?
    我们在做短视频整套源码的时候通常会遇到前端提交按钮重复点击的场景,在某些新增操作上就需要做幂等性限制来保证数据的可靠性。下面来用javaaop实现幂等性校验。一:首先我们需要一个自定义注解 packagecom.yuku.yuku_erp.annotation;importjava.lang.annotation.......
  • 计算机网络:网络层 —— 开放最短路径优先 OSPF
    文章目录路由选择协议动态路由协议开放最短路径优先OSPF链路状态OSPF路由器邻居关系的建立和维护链路状态通告链路状态更新分组链路状态数据库OSPF的五种分组类型OSPF的基本工作过程多点接入网络中的OSPF路由器OSPF划分区域OSPF区域的类型OSPF区域的相关概念路......