fastapi路径参数之枚举类型

1,517 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

创建Enum类

  • 当我们设计的URL中的路径参数,包含部分枚举变量时,我们可以使用Python的Enum类型
  • 比如:路径参数/model/{model_name}中的model_name是枚举变量,枚举值是三个字符串,此时可以创建一个EnumModelName
 from enum import Enum
 ​
 ​
 class ModelName(str, Enum):
     alexnet = "alexnet"
     resnet = "resnet"
     lenet = "lenet"
  • 导入 Enum 并创建一个继承自 strEnum 的子类。
  • 通过从 str 继承,API 文档将能够知道这些值必须为 string 类型并且能够正确地展示出来。
  • 然后创建具有固定值的类属性,这些固定值将是可用的有效值。

声明路径参数

  • 使用你定义的枚举类(ModelName)创建一个带有类型标注的路径参数
 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):
     pass
  • 此时,因为model_name的类型是ModelName所以,这个变量的值只可能是该枚举变量的一个枚举成员。
  • 应为指定了路径参数可用值,所以API交互式文档上也会展示下拉可选的三个枚举值。

比较枚举成员

  • 变量model_name可以和你创建的枚举类 ModelName 中的枚举成员进行比较:
 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 == ModelName.alexnet:
         return {"model_name": model_name, "message": "Deep Learning FTW!"}

获取枚举值

  • 可以使用 model_name.value来获取实际的值(在这个例子中为 str):
  • 你也可以通过 ModelName.lenet.value 来获取值 "lenet"
 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.value == "lenet":
         return {"model_name": model_name, "message": "LeCNN all the images"}

返回枚举成员

  • 在路径操作函数内,可以直接将枚举类型的变量响应给客户端,该变量会在返回给客户端之前转换为对应的值
  • 比如,下面例子中的model_name会转换为三个字符串(因为ModelName继承str所以本质上还是字符串)。
  • 即使枚举变量model_name嵌套在列表或字典中,在返回个客户端之前都会被转换为具体类型的值。
 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):
     return {"model_name": model_name, "message": "Have some residuals"}