使用FastAPI,我已经设置了一个POST端点,它接受一个命令,我希望这个命令不区分大小写,同时仍然有建议的值(即在SwaggerUI文档中)
为此,我设置了一个具有Command
类的端点作为POST正文参数的模式:
@router.post("/command", status_code=HTTPStatus.ACCEPTED) # @router is a fully set up APIRouter()
async def control_battery(command: Command):
result = do_work(command.action)
return result
对于Command
我目前有2个可能的版本,这两个都没有我想要的全部功能.
from fastapi import HTTPException
from pydantic import BaseModel, field_validator
from typing import Literal
## VERSION 1
class Command(BaseModel):
action: Literal["jump", "walk", "sleep"]
## VERSION 2
class Command(BaseModel):
action: str
@field_validator('action')
@classmethod
def validate_command(cls, v: str) -> str:
"""
Checks if command is valid and converts it to lower.
"""
if v.lower() not in {'jump', 'walk', 'sleep'}:
raise HTTPException(status_code=422, detail="Action must be either 'jump', 'walk', or 'sleep'")
return v.lower()
版本1的HAS显然不区分大小写,但具有正确的"建议值"行为,如下所示.
而版本2具有正确的大小写敏感性,并允许对验证进行更好的控制,但不再与架构的用户共享建议值.例如,在上面的图像中,"JUMP"将替换为"STRING".
如何将这两种方法的功能结合起来?