相关疑难解决方法(0)

如何使用 FastAPI 从 Pydantic 模型中排除可选未设置值?

我有这个模型:

class Text(BaseModel):
    id: str
    text: str = None


class TextsRequest(BaseModel):
    data: list[Text]
    n_processes: Union[int, None]
Run Code Online (Sandbox Code Playgroud)

所以我希望能够接受如下请求:

{"data": ["id": "1", "text": "The text 1"], "n_processes": 8} 
Run Code Online (Sandbox Code Playgroud)

{"data": ["id": "1", "text": "The text 1"]}.
Run Code Online (Sandbox Code Playgroud)

现在在第二种情况下我得到

{'data': [{'id': '1', 'text': 'The text 1'}], 'n_processes': None}
Run Code Online (Sandbox Code Playgroud)

使用此代码:

app = FastAPI()

@app.post("/make_post/", response_model_exclude_none=True)
async def create_graph(request: TextsRequest):
    input_data = jsonable_encoder(request)
Run Code Online (Sandbox Code Playgroud)

n_processes那么这里我该如何排除呢?

python optional-parameters pydantic fastapi

10
推荐指数
2
解决办法
2万
查看次数

FastAPI - 带有 Pydantic 列表字段的 GET 请求

GET我是 FastAPI 的新手(从 Flask 迁移),我正在尝试为我的路线创建一个 Pydantic 模型:

from fastapi import APIRouter,Depends
from pydantic import BaseModel
from typing import Optional,List

router = APIRouter()

class SortModel(BaseModel):
    field:    Optional[str]
    directions: List[str]

@router.get("/pydanticmodel")
def get_sort(criteria: SortModel = Depends(SortModel)):
    pass #my code for handling this route.....
Run Code Online (Sandbox Code Playgroud)

当我跑步时 curl -X GET http://localhost:XXXX/pydanticmodel?directions=up&directions=asc&field=id 我得到422 Unprocessable Entity: {"detail":[{"loc":["body"],"msg":"field required","type":"value_error.missing"}]}

但如果我正在改变directions:List[str]->directions: str我正在200 OK接受directions="asc". str对于查询参数有效而List[str]无效的原因是什么?我究竟做错了什么?

谢谢。

python pydantic fastapi

9
推荐指数
2
解决办法
8652
查看次数

即使其中一个验证器失败,如何检查所有 Pydantic 验证器,然后在 FastAPI 响应中引发多个 ValueError?

是否可以调用所有验证器来获取完整的错误列表?

@validator('password', always=True)
def validate_password1(cls, value):
    password = value.get_secret_value()

    min_length = 8
    if len(password) < min_length:
        raise ValueError('Password must be at least 8 characters long.')

    return value

@validator('password', always=True)
def validate_password2(cls, value):
    password = value.get_secret_value()

    if not any(character.islower() for character in password):
        raise ValueError('Password should contain at least one lowercase character.')

    return value
Run Code Online (Sandbox Code Playgroud)

当前的行为似乎一次调用一个验证器。

我的 Pydantic 课程:

class User(BaseModel):
    email: EmailStr
    password: SecretStr
Run Code Online (Sandbox Code Playgroud)

如果我没有在请求中包含email, 或password, 字段,那么我会在数组中得到两个验证失败,这就是我想要对该字段执行的操作password,但当前的行为似乎调用了一个,如果失败则抛出立即出现错误。

python python-3.x pydantic fastapi

7
推荐指数
1
解决办法
7201
查看次数

如何使用 FastAPI 在 Pydantic 字段中设置范围和超出范围的值?

所以我有以下代码行:

item: Optional[int] = Field(None, ge=1, le=168)
Run Code Online (Sandbox Code Playgroud)

我也希望有可能设定-1价值。因此,我需要排除零值,但我想允许一个值和来自to-1的值。1168

有什么办法可以做到这一点吗?

python range pydantic fastapi

7
推荐指数
1
解决办法
2万
查看次数

使用 pydatinc 对 FastAPI 的查询参数进行自定义验证会导致内部服务器错误

我的GET端点收到一个需要满足以下条件的查询参数:

  1. 介于int0 和 10 之间
  2. 是偶数

1.直接使用Query(gt=0, lt=10). 但是,我不清楚如何扩展Query以进行额外的自定义验证,例如2.. 该文档最终导致了 pydantic。但是,当第二次验证失败时,我的应用程序遇到内部服务器错误2.

下面是一个最小范围的示例

from fastapi import FastAPI, Depends, Query
from pydantic import BaseModel, ValidationError, validator

app = FastAPI()

class CommonParams(BaseModel):
    n: int = Query(default=..., gt=0, lt=10)

    @validator('n')
    def validate(cls, v):
        if v%2 != 0:
            raise ValueError("Number is not even :( ")
        return v


@app.get("/")
async def root(common: CommonParams = Depends()):
    return {"n": common.n}
Run Code Online (Sandbox Code Playgroud)

以下是按预期工作的请求和失败的请求:

# requsts that work …
Run Code Online (Sandbox Code Playgroud)

python exception valueerror pydantic fastapi

6
推荐指数
1
解决办法
1724
查看次数

如何验证pydantic模型的多个领域

我想验证pydantic模型的三个模型字段。为此,我正在从 pydantic 导入 root_validator。低于错误。我在https://pydantic-docs.helpmanual.io/usage/validators/#root-validators 中找到了这个。任何人都可以帮助我。找出下面的错误。from pydantic import BaseModel, ValidationError, root_validator Traceback (最近一次调用): File "", line 1, in ImportError: cannot import name 'root_validator' from 'pydantic' (C:\Users\Lenovo\AppData\Local\Programs\ Python\Python38-32\lib\site-packages\pydantic__init__.py)

我试过

@validator
def validate_all(cls,v,values,**kwargs):
Run Code Online (Sandbox Code Playgroud)

我从一些常见的字段父模型继承了我的 pydantic 模型。仅显示父类字段的值,但不显示我的子类字段。例如

class Parent(BaseModel):
    name: str
    comments: str
class Customer(Parent):
    address: str
    phone: str

    @validator
    def validate_all(cls,v,values, **kwargs):
         #here values showing only (name and comment) but not address and phone.
Run Code Online (Sandbox Code Playgroud)

python validation pydantic

5
推荐指数
4
解决办法
5768
查看次数

从pydantic模型查询参数

有没有办法将pydantic模型转换为fastapi中的查询参数?

我的一些端点通过主体传递参数,但其他一些端点直接在查询中传递它们。所有这些端点共享相同的数据模型,例如:

class Model(BaseModel):
    x: str
    y: str
Run Code Online (Sandbox Code Playgroud)

我想避免在我的“查询参数端点”的定义中重复我对此模型的定义,例如test_query在此代码中:

class Model(BaseModel):
    x: str
    y: str

@app.post("/test-body")
def test_body(model: Model): pass

@app.post("/test-query-params")
def test_query(x: str, y: str): pass
Run Code Online (Sandbox Code Playgroud)

这样做最干净的方法是什么?

pydantic fastapi

5
推荐指数
2
解决办法
2604
查看次数

如何使用 FastAPI 在 OpenAPI/Swagger 中记录默认 None/null?

使用 ORM,我想要执行一个 POST 请求,让某些字段具有null值,该值将在数据库中转换为那里指定的默认值。

问题是 OpenAPI (Swagger) docs忽略了默认值None,并且默认情况下仍然提示 a UUID

from fastapi import FastAPI
from pydantic import BaseModel
from typing import Optional
from uuid import UUID
import uvicorn


class Table(BaseModel):
    # ID: Optional[UUID]      # the docs show a example UUID, ok
    ID: Optional[UUID] = None # the docs still shows a uuid, when it should show a null or valid None value.

app = FastAPI()  
    
@app.post("/table/", response_model=Table)
def create_table(table: Table):
    # here we call …
Run Code Online (Sandbox Code Playgroud)

python database swagger openapi fastapi

5
推荐指数
1
解决办法
9647
查看次数

如何使用 Python 的枚举和 FastAPI 做出不区分大小写的选择?

我有这个应用程序:

import enum
from typing import Annotated, Literal

import uvicorn
from fastapi import FastAPI, Query, Depends
from pydantic import BaseModel

app = FastAPI()


class MyEnum(enum.Enum):
    ab = "ab"
    cd = "cd"


class MyInput(BaseModel):
    q: Annotated[MyEnum, Query(...)]


@app.get("/")
def test(inp: MyInput = Depends()):
    return "Hello world"


def main():
    uvicorn.run("run:app", host="0.0.0.0", reload=True, port=8001)


if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

curl http://127.0.0.1:8001/?q=abcurl http://127.0.0.1:8001/?q=cd返回“Hello World”

但任何这些

  • curl http://127.0.0.1:8001/?q=aB
  • curl http://127.0.0.1:8001/?q=AB
  • curl http://127.0.0.1:8001/?q=Cd
  • ETC

返回422Unprocessable Entity这是有道理的。

如何使此验证不区分大小写?

enums pydantic fastapi

5
推荐指数
1
解决办法
3873
查看次数

如何使用 FastAPI 将下拉菜单添加到基于 BaseModel 的 Swagger UI autodocs?

我有以下课程:

class Quiz(BaseModel):
    question: str
    subject: str
    choice: str = Query(choices=('eu', 'us', 'cn', 'ru'))
         
Run Code Online (Sandbox Code Playgroud)

我可以像这样基于此类渲染表单

@api.post("/postdata")
def post_data(form_data: Quiz = Depends()):
    return form_data
Run Code Online (Sandbox Code Playgroud)

如何显示选择字段的下拉列表?

python swagger swagger-ui openapi fastapi

4
推荐指数
1
解决办法
3646
查看次数