当前位置: 首页> 健康> 养生 > 网站制作书籍_运营团队架构_朋友圈广告推广平台_网络优化seo

网站制作书籍_运营团队架构_朋友圈广告推广平台_网络优化seo

时间:2025/8/23 17:36:26来源:https://blog.csdn.net/skywalk8163/article/details/143248450 浏览次数:0次
网站制作书籍_运营团队架构_朋友圈广告推广平台_网络优化seo

 官网文档:表单数据 - FastAPI

表单数据¶

接收的不是 JSON,而是表单字段时,要使用 Form表单

from fastapi import FastAPI, Formapp = FastAPI()@app.post("/login/")
async def login(username: str = Form(), password: str = Form()):return {"username": username}

"说明"

要使用表单,需预先安装 python-multipart。

例如,pip install python-multipart

导入 Form

from fastapi import FastAPI, Form

定义 Form 参数¶

@app.post("/login/")
async def login(username: str = Form(), password: str = Form()):return {"username": username}

例如,OAuth2 规范的 "密码流" 模式规定要通过表单字段发送 username 和 password

该规范要求字段必须命名为 username 和 password,并通过表单字段发送,不能用 JSON。

使用 Form 可以声明与 Body (及 QueryPathCookie)相同的元数据和验证。

"说明"

Form 是直接继承自 Body 的类。

"提示"

声明表单体要显式使用 Form ,否则,FastAPI 会把该参数当作查询参数或请求体(JSON)参数。

关于 "表单字段"¶

与 JSON 不同,HTML 表单(<form></form>)向服务器发送数据通常使用「特殊」的编码。

FastAPI 要确保从正确的位置读取数据,而不是读取 JSON。

"技术细节"

表单数据的「媒体类型」编码一般为 application/x-www-form-urlencoded

但包含文件的表单编码为 multipart/form-data。文件处理详见下节。

编码和表单字段详见 MDN Web 文档的 POST小节。

"警告"

可在一个路径操作中声明多个 Form 参数,但不能同时声明要接收 JSON 的 Body 字段。因为此时请求体的编码是 application/x-www-form-urlencoded,不是 application/json

这不是 FastAPI 的问题,而是 HTTP 协议的规定。

小结¶

本节介绍了如何使用 Form 声明表单数据输入参数。

表单模型


您可以使用Pydantic模型在FastAPI中声明表单字段。

资讯
要使用表单,请先安装python multipart。
确保您创建了一个虚拟环境,激活它,然后安装它,例如:

$ pip install python-multipart

注:
自FastAPI 0.113.0版本起支持此功能。🤓


表单的Pydantic模型


您只需声明一个Pydantic模型,其中要接收的字段为表单字段,然后将参数声明为form:

from typing import Annotatedfrom fastapi import FastAPI, Form
from pydantic import BaseModelapp = FastAPI()class FormData(BaseModel):username: strpassword: str@app.post("/login/")
async def login(data: Annotated[FormData, Form()]):return data


FastAPI将从请求中的表单数据中提取每个字段的数据,并为您提供您定义的Pydantic模型。

查看文档


您可以在/docs的文档UI中进行验证:


禁止添加额外的表单字段


在某些特殊用例中(可能不是很常见),您可能希望将表单字段限制为仅在Pydantic模型中声明的字段。并禁止任何额外的字段。

注:
自FastAPI 0.114.0版本起支持此功能。🤓


您可以使用Pydantic的模型配置来禁止任何额外的字段:

class FormData(BaseModel):username: strpassword: strmodel_config = {"extra": "forbid"}


如果客户端试图发送一些额外的数据,他们将收到错误响应。
例如,如果客户端尝试发送表单字段:

  • usernameRick
  • passwordPortal Gun
  • extraMr. Poopybutthole


他们将收到一个错误响应,告诉他们不允许使用额外的字段:

{"detail": [{"type": "extra_forbidden","loc": ["body", "extra"],"msg": "Extra inputs are not permitted","input": "Mr. Poopybutthole"}]
}


摘要


您可以使用Pydantic模型在FastAPI中声明表单字段。😎

实践

源代码

代码写入form.py文件

from typing import Annotatedfrom fastapi import FastAPI, Form
from pydantic import BaseModelapp = FastAPI()class FormData(BaseModel):username: strpassword: str@app.post("/login/")
async def login(data: Annotated[FormData, Form()]):return data

启动服务

uvicorn form:app --reload

浏览测试

使用curl来进行测试

curl -X POST "http://127.0.0.1:8000/login/" -H "Content-Type: application/x-www-form-urlencoded" -d "username=your_username&password=your_password"
{"username":"your_username","password":"your_password"}

注意,这里需要带头类型:"Content-Type: application/x-www-form-urlencoded"

这也是前面讲过的:表单数据的「媒体类型」编码一般为 application/x-www-form-urlencoded

关键字:网站制作书籍_运营团队架构_朋友圈广告推广平台_网络优化seo

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: