FastApi教程|路径参数

发表时间:2020-03-09

您可以使用Python格式字符串使用的相同语法声明路径“参数”或“变量”:

from fastapi import FastAPI

app = FastAPI()


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

path参数的值 item_id 将作为 参数 传递给您的函数 item_id

因此,如果运行此示例并转到 http://127.0.0.1:8000/items/foo ,您将看到以下响应:

{"item_id":"foo"}

路径参数与类型

您可以使用标准的Python类型注释在函数中声明路径参数的类型:

from fastapi import FastAPI

app = FastAPI()


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

在这种情况下, item_id 被声明为 int

校验

这将为您的函数提供编辑器支持,包括错误检查,完成等。

数据 转换

如果运行此示例并在 http://127.0.0.1:8000/items/3中 打开浏览器 ,您将看到以下响应:

{"item_id":3}

校验

请注意 3 ,作为Python int , 函数收到(返回)的值 不是string "3"

因此,使用该类型声明, FastAPI 为您提供自动请求 “解析” 。

数据验证

但是,如果您通过 http://127.0.0.1:8000/items/foo 进入浏览器 ,则会看到一个不错的HTTP错误:

{
    "detail": [
        {
            "loc": [
                "path",
                "item_id"
            ],
            "msg": "value is not a valid integer",
            "type": "type_error.integer"
        }
    ]
}

因为path参数 item_id 的值为 "foo" ,而不是 int

如果您提供a float 而不是int, 则会出现相同的错误 ,例如: http : //127.0.0.1 : 8000/items/4.2

校验

因此,使用相同的Python类型声明, FastAPI可以 为您提供数据验证。

注意,该错误也清楚地指出了验证未通过的点。

在开发和调试与您的API交互的代码时,这非常有用。

文档

当您在 http://127.0.0.1:8000/docs上 打开浏览器时 ,您将看到一个自动的,交互式的API文档,例如:

校验

同样,仅使用相同的Python类型声明, FastAPI即可 为您提供自动的交互式文档(集成Swagger UI)。

请注意,path参数声明为整数。

基于标准的好处,替代文档

并且由于生成的架构来自 OpenAPI 标准,因此有许多兼容的工具。

因此, FastAPI 本身提供了替代的API文档(使用ReDoc):

同样,有许多兼容的工具。 包括多种语言的代码生成工具。

金字塔

所有数据验证都是在 Pydantic的幕后进行的 ,因此您将获得所有好处。 而且您知道自己处于良好状态。

您可以使用同一类型的声明有 str float bool 和许多其他复杂数据类型。

本教程的下一章将探讨其中的一些内容。

订单很重要

创建 路径操作时 ,您会发现路径固定的情况。

就像 /users/me ,假设它是要获取有关当前用户的数据。

然后,您还可以使用一条路径 /users/{user_id} ,通过某些用户ID来获取有关特定用户的数据。

由于 路径操作 是按顺序评估的,因此您需要确保for的路径在for的路径 /users/me 之前声明 /users/{user_id}

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/{user_id} 也将匹配 /users/me ,“认为”它正在接收 user_id 值为的 参数 "me"

预定义值

如果您有一个 接收 路径参数 路径操作 ,但是想要 预定义 可能的有效 路径参数 值,则可以使用标准Python 。 Enum

创建一个 Enum

导入 Enum 并创建一个继承自 str 和从 继承的子类 Enum

通过从 str API 继承, 文档将能够知道这些值必须是类型, string 并且能够正确呈现。

并创建具有固定值的类属性,这些固定值将是可用的有效值:

from enum import Enum

from fastapi import FastAPI


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


app = FastAPI()


@app.get("/model/{model_name}")
async def get_model(model_name: ModelName):
    if model_name == 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"}

信息

从3.4版 开始,枚举(或枚举)在Python中可用

小费

如果您想知道,“ AlexNet”,“ ResNet”和“ LeNet”只是机器学习 模型的 名称 。

声明一个 路径参数

然后 使用您创建的枚举类( ) 创建带有类型注释 的 路径参数 ModelName

from enum import Enum

from fastapi import FastAPI


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


app = FastAPI()


@app.get("/model/{model_name}")
async def get_model(model_name: ModelName):
    if model_name == 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"}

检查文档

由于 指定 了 path参数 的可用值 ,因此交互式文档可以很好地显示它们:

使用Python 枚举

path参数 的值 将是一个 枚举成员

比较 枚举成员

您可以将其与 您创建的枚举中 的 枚举成员 进行比较 ModelName

from enum import Enum

from fastapi import FastAPI


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


app = FastAPI()


@app.get("/model/{model_name}")
async def get_model(model_name: ModelName):
    if model_name == 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"}

获取 枚举值

您可以 str 使用 model_name.value 或通常 通过以下方式获得实际值( 在这种情况下为a) your_enum_member.value

from enum import Enum

from fastapi import FastAPI


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


app = FastAPI()


@app.get("/model/{model_name}")
async def get_model(model_name: ModelName):
    if model_name == 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"}

小费

您也可以访问该值 "lenet" ModelName.lenet.value

返回 枚举成员

您可以 从您的 path操作 返回 枚举成员 ,甚至嵌套在JSON主体中(例如 )。 dict

在将它们返回给客户端之前,它们将被转换为相应的值:

from enum import Enum

from fastapi import FastAPI


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


app = FastAPI()


@app.get("/model/{model_name}")
async def get_model(model_name: ModelName):
    if model_name == 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"}

含有路径的路径参数

比方说,你有一个 路径操作 与路径 /files/{file_path}

但是您需要 file_path 自己包含一条 路径 ,例如 home/johndoe/myfile.txt

因此,该文件的URL类似于: /files/home/johndoe/myfile.txt

OpenAPI的支持

OpenAPI不支持声明 路径参数 以在其中包含 路径的方法 ,因为这可能导致难以测试和定义的场景。

不过,您仍然可以 使用 Starlette 的内部工具之一在FastAPI中进行操作。

尽管仍未添加任何说明该参数应包含路径的文档,但这些文档仍然可以使用。

路径转换器

直接从Starlette使用选项,您可以 使用以下网址 声明 包含 路径 path参数

/files/{file_path:path}

在这种情况下,参数的名称为 file_path ,最后一部分 :path 告诉它参数应与任何 路径 匹配 。

因此,您可以将其用于:

from fastapi import FastAPI

app = FastAPI()


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

小费

您可能需要包含包含参数的参数 /home/johndoe/myfile.txt ,并带有一个斜杠( / )。

在这种情况下,URL为: /files//home/johndoe/myfile.txt ,并且 // files 和 之间 使用双斜杠( ) home

回顾

使用 FastAPI ,通过使用简短,直观和标准的Python类型声明,您将获得:

  • 编辑器支持:错误检查,自动完成等
  • 数据“ 解析 ”
  • 资料验证
  • API批注和自动文档

您只需要声明一次即可。

与替代框架相比, 这可能是 FastAPI 的主要可见优势 (除了原始性能)。

文章来源互联网,如有侵权,请联系管理员删除。邮箱:417803890@qq.com / QQ:417803890

微配音

Python Free

邮箱:417803890@qq.com
QQ:417803890

皖ICP备19001818号-4
© 2019 copyright www.pythonf.cn - All rights reserved

微信扫一扫关注公众号:

联系方式

Python Free