FastAPI 等效于 Flask 的 request.form,用于不可知的表单

Posted

技术标签:

【中文标题】FastAPI 等效于 Flask 的 request.form,用于不可知的表单【英文标题】:FastAPI equivalent of Flask's request.form, for agnostic forms 【发布时间】:2020-10-04 18:01:12 【问题描述】:

我尝试从 Flask 迁移到 FastAPI,我想知道是否有类似 Flask 的东西:

payload = request.form.to_dict(flat=False)
payload = key:payload[key][0] for key in payload

用于 FastAPI。

到目前为止,我只发现了一些技巧,您是否仍然必须将表单的所有参数一个接一个地实现给一个函数:

from pydantic import BaseModel
class FormData(BaseModel):
    alfa: str=Form(...)
    vita: str=Form(...)
async def Home(request: Request, form_data:FormData)

这个例子的可读性当然比标准的表单处理要好:

async def Home(username: str = Form(...), something_else: str = Form(...)):

但由于所有表单字段的必要声明,它仍然有很大的限制。

还有其他更不可知更优雅的方法吗?

提前致谢,如果这是一个我无法通过谷歌搜索找到的微不足道的问题,我深表歉意:)

【问题讨论】:

【参考方案1】:

你可以得到底层的 starlette request 并使用它的 request.form() 方法。它需要python-multipart 才能工作:

from fastapi import FastAPI, Request

app = FastAPI()

@app.post("/example")
async def example(request: Request):
    form_data = await request.form()
    return form_data

调用示例:

C:\>curl -X POST "http://localhost:8000/example" -d "hello=there&another=value"
"hello":"there","another":"value"

【讨论】:

为什么这不是表单问题的第一个解决方案,即使是表单示例也不能从 FastApi 站点工作。这对我帮助很大。

以上是关于FastAPI 等效于 Flask 的 request.form,用于不可知的表单的主要内容,如果未能解决你的问题,请参考以下文章

架构 Flask 与 FastAPI

FastAPI - 一款新型的 Python Web 框架(对比 Flask)

从Flask到FastApi

从Flask到FastAPI的平滑迁移

flask与fastapi性能测试

FASTAPI快速入门