【问题标题】:Request validation请求验证
【发布时间】:2021-11-14 23:04:06
【问题描述】:

我想验证请求中的数据 我有字典(a 和 b 是用例,1234 是子用例)

d ={'a':[1,2],'b':[3,4]}

并请求 @router.post("/documents")

from typing import Literal, List, Optional, Dict

@router.post("/documents")
async def data(usecase: Literal[frozenset(d.keys())] = Form(...))

它有效并且只允许值 a 和 b

但我想扩展验证

@router.post("/documents")
    async def data(usecase: Literal[frozenset(d.keys())] = Form(...),
                   subusecase: THERE I WANNA VALIDATE 1234 VALUES  = Form(...)
                   )

非常感谢您的帮助

【问题讨论】:

  • class Usecase: a: Literal[1, 2, 3, 4], b: Literal[1, 2, 3, 4]?然后将其用作请求的类型?您还可以将 Literal 序列定义为变量,然后将其重新用于两个值; subusecases = Literal[1, 2, 3, 4], class Usecase: a: subusecases, b: subusecases
  • 感谢您关注我的问题。我想准确地使用 dict d。我的期望应该是这样的子用例: Dict[usecase]: str = Form(...)

标签: python fastapi pydantic


【解决方案1】:

我不确定我是否完全理解您的路线接收到的数据的结构。

如果您想验证来自嵌套字典等复杂结构的路由输入,我认为最好使用pydantic modelpydantic validation function

您将一个 pydantic 模型作为参数传递给您的路线:

@router.post("/documents")
async def data(use_cases: UseCases):
    #  do something with your uses_cases
    pass

pydantic 模型示例:

from typing import List

from pydantic import BaseModel, validator


class UseCases(BaseModel):
    a: List[int]
    b: List[int]

    @validator('a')
    def a_must_containt_something(cls, v):
        #  add your validations here
        return v

    @validator('b')
    def b_must_containt_something(cls, v):
        #  add your validations here
        return v

【讨论】:

    猜你喜欢
    • 2018-10-18
    • 2018-04-02
    • 2017-11-21
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多