我尝试从HTML表单提交数据,并使用Pydantic模型进行验证。
使用此代码
from fastapi import FastAPI, Form
from pydantic import BaseModel
from starlette.responses import HTMLResponse
app = FastAPI()
@app.get("/form", response_class=HTMLResponse)
def form_get():
return '''<form method="post">
<input type="text" name="no" value="1"/>
<input type="text" name="nm" value="abcd"/>
<input type="submit"/>
</form>'''
class SimpleModel(BaseModel):
no: int
nm: str = ""
@app.post("/form", response_model=SimpleModel)
def form_post(form_data: SimpleModel = Form(...)):
return form_data
但是,我得到了HTTP错误:“422
不可处理的实体”
{
"detail": [
{
"loc": [
"body",
"form_data"
],
"msg": "field required",
"type": "value_error.missing"
}
]
}
等效的curl命令(由Firefox生成)是
curl 'http://localhost:8001/form' -H 'Content-Type: application/x-www-form-urlencoded' --data 'no=1&nm=abcd'
这里的请求体包含no=1&nm=abcd
。
我做错了什么?
9条答案
按热度按时间ogq8wdun1#
我发现了一个解决方案,可以帮助我们使用Pydantic与FastAPI表单:)
我的代码:
它在《招摇》中表现为一种常见的形式。
作为装饰器,它可以更通用:
用法看起来像
h22fl7wq2#
使用数据类可以更简单地完成此操作
n6lpvg4x3#
我实现了这里找到的解决方案Mause solution,它似乎可以工作
6ju8rftf4#
你可以使用下面的数据表单:
qojgxg4l5#
如果您只考虑将表单数据抽象到一个类中,那么可以使用普通类来实现
它也可以转化为一个Pydantic模型
iqxoj9l96#
以这种方式创建类:
测试结果:
如果你想从JavaScript发出一个http请求,你必须使用FormData来构造请求:
a6b3iqyw7#
我对proposal of Nikita Davydov做了一点修改,使验证器可以在Pydatic2和FastAPI 0.103.1中工作
用法:
当尝试提交数据验证时,按预期返回错误:
7ivaypg98#
Tldr:其他解决方案的mypy兼容可继承版本,生成正确的OpenAPI模式字段类型,而不是任何/未知类型。
现有解决方案将FastAPI参数设置为
typing.Any
,以防止验证发生两次并失败,这会导致生成的API规范具有这些表单字段的任何/未知参数类型。该解决方案在模式生成之前临时将正确的注解注入到路由中,并且之后将它们重置为与其他解决方案一致。
form_utils.py
# asgi.py
z6psavjg9#
更新了Zac Stucke的答案,使其解决方案可以在Pydantic2中工作(以及mypy支持)
# form_utils.py