FastAPI/Pydantic 可以单独验证列表中的输入项吗?

Can FastAPI/Pydantic individually validate input items in a list?

我有一个快速APIpost方法:

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"}
]

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

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

欢迎来到 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

与 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)