【问题标题】:Can FastAPI/Pydantic individually validate input items in a list?FastAPI/Pydantic 可以单独验证列表中的输入项吗?
【发布时间】:2020-10-02 15:50:45
【问题描述】:

我有一个 FastAPI 发布方法:

from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
from pydantic import BaseModel
from typing import List

import pandas as pd

class InputItem(BaseModel):
    Feature: str

class Item(BaseModel):
    Feature: str
    Result: str

app = FastAPI()

@app.post("/", response_model=List[OutputItem])
def my_function(input: List[InputItem]): 
    df = pd.DataFrame(jsonable_encoder(input))
    result = df.apply(another_method)
    return result.to_dict(orient=records)

我的问题是,如果我将这样的列表传递给它:

[
  {"NOTFeature":"value"},
  {"Feature":"value"},
  {"Feature":"value"}
]

或者如果其中一个值属于不同的数据类型,则整个事情当前失败并返回错误。有没有办法让它处理错误以便跳过失败的条目,并且仍然对列表中通过验证的项目执行 API 函数?

顺便说一句,如果有一种更流畅的方法来处理仍然使用数据帧的数据帧转换(这些对于函数中完成的其他数据处理是必不可少的),这也将非常有帮助!

【问题讨论】:

  • 可以添加错误信息吗?
  • 在 API 方面,我刚刚得到:“POST /batch HTTP/1.1”422 无法处理的实体。从帖子方面来看,这取决于消息中的错误,但这里有一些示例: (a) 所需类别之一被错误命名:响应 422; '{"detail":[{"loc":["body",0,"StartTime"],"msg":"field required","type":"value_error.missing"}]}' (b) 其中bool 类别字段的类型错误:响应 422:'{"detail":[{"loc":["body",0,"IsValid"],"msg":"value could not be parsed to a boolean", "type":"type_error.bool"}]}'

标签: python python-3.x fastapi pydantic


【解决方案1】:

欢迎使用 Stack Overflow。

您的问题的简短回答是。这是因为处理有效载荷内容或修复格式错误的有效载荷不是 pydantic(以及 FastAPI)的责任。

您可以这样做的正确方法是使Feature 成员Optional 并在它到达您的方法时过滤掉,如下所示:

import fastapi
import typing
import pydantic

class InputItem(pydantic.BaseModel):
    feature: typing.Optional[str]

class OutputItem(pydantic.BaseModel):
    Feature: str
    Result: str

app = fastapi.FastAPI()

@app.post("/", response_model=typing.List[OutputItem])
def my_function(data: typing.List[InputItem]):
    data = [i for i in data if i.feature is not None]
    print(data)
    # ... do what you gotta do

【讨论】:

    【解决方案2】:

    与 dict 联合作为传递似乎对我有用,即:

    from typing import List, Union
    
    @app.post("/", response_model=List[OutputItem])
    def my_function(input: List[Union[InputItem, dict]]): 
        df = pd.DataFrame(jsonable_encoder(input))
        result = df.apply(another_method)
        return result.to_dict(orient=records)
    

    【讨论】:

      猜你喜欢
      • 2022-01-15
      • 2022-09-28
      • 2020-12-04
      • 2020-09-09
      • 2012-07-14
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多