网站首页 > 技术文章 正文
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于基于标准 Python 类型提示使用 Python 3.7+ 构建 API。处理表单和用户输入是 Web 开发中的常见任务,FastAPI 凭借其强大的功能使其变得简单。在本博客中,我们将探讨如何在 FastAPI 中处理表单数据,并提供一些实用的演示来帮助您入门。
FastAPI 中表单处理简介
表单是用户向您的 Web 应用程序提交数据的基本方式。FastAPI 提供了强大的工具来高效处理表单数据,利用 fastapi 和 pydantic 模型中的 Form 类来验证和解析传入的数据。
先决条件
在深入研究之前,请确保您已安装 FastAPI 和 uvicorn。如果没有,您可以使用以下方法安装它们:
pip install fastapi uvicorn
基本设置
让我们从一个基本的 FastAPI 应用程序开始,以处理简单的表单提交。
创建 FastAPI 应用:首先,在名为 main.py 的文件中设置一个基本的 FastAPI 应用。
from fastapi import FastAPI, Form
from fastapi.responses import HTMLResponse
app = FastAPI()
@app.get("/", response_class=HTMLResponse)
async def read_form():
return """
<form action="/submit" method="post">
<input type="text" name="name" placeholder="Enter your name">
<input type="email" name="email" placeholder="Enter your email">
<button type="submit">Submit</button>
</form>
"""
@app.post("/submit")
async def handle_form(name: str = Form(...), email: str = Form(...)):
return {"name": name, "email": email}
运行应用程序:使用 uvicorn 运行您的 FastAPI 应用程序。
uvicorn main:app --reload
打开浏览器并导航至 http://127.0.0.1:8000。您应该会看到一个简单的表单,允许用户提交他们的姓名和电子邮件。
使用 Pydantic 模型处理表单数据
对于更复杂的表单,您可以使用 Pydantic 模型来验证和解析传入的数据。这种方法在处理多个字段或更复杂的验证逻辑时很有用。
定义 Pydantic 模型:创建一个 Pydantic 模型来表示表单数据。
from pydantic import BaseModel, EmailStr
class FormData(BaseModel):
name: str
email: EmailStr
更新端点:更新您的表单处理端点以使用 Pydantic 模型。
from fastapi import FastAPI, Form, Depends
from pydantic import BaseModel, EmailStr
app = FastAPI()
class FormData(BaseModel):
name: str
email: EmailStr
@app.get("/", response_class=HTMLResponse)
async def read_form():
return """
<form action="/submit" method="post">
<input type="text" name="name" placeholder="Enter your name">
<input type="email" name="email" placeholder="Enter your email">
<button type="submit">Submit</button>
</form>
"""
@app.post("/submit")
async def handle_form(form_data: FormData = Depends(FormData)):
return form_data.dict()
使用表单处理文件上传
FastAPI 还支持文件上传使用表单。让我们在表单中添加一个文件上传字段并处理上传的文件。
更新表单:在 read_form 端点中向表单添加一个文件上传字段。
@app.get("/", response_class=HTMLResponse)
async def read_form():
return """
<form action="/submit" method="post" enctype="multipart/form-data">
<input type="text" name="name" placeholder="Enter your name">
<input type="email" name="email" placeholder="Enter your email">
<input type="file" name="file">
<button type="submit">Submit</button>
</form>
"""
处理文件上传:更新 handle_form 端点以处理上传的文件。
from fastapi import FastAPI, Form, UploadFile, File, Depends
from pydantic import BaseModel, EmailStr
app = FastAPI()
class FormData(BaseModel):
name: str
email: EmailStr
@app.get("/", response_class=HTMLResponse)
async def read_form():
return """
<form action="/submit" method="post" enctype="multipart/form-data">
<input type="text" name="name" placeholder="Enter your name">
<input type="email" name="email" placeholder="Enter your email">
<input type="file" name="file">
<button type="submit">Submit</button>
</form>
"""
@app.post("/submit")
async def handle_form(name: str = Form(...), email: str = Form(...), file: UploadFile = File(...)):
content = await file.read()
return {"name": name, "email": email, "file_size": len(content)}
这里还有一些更高级的演示,用于在 FastAPI 中处理表单和用户输入:
演示 1:使用嵌套的 Pydantic 模型处理表单数据
有时,表单可以具有嵌套的数据结构。FastAPI 和 Pydantic 可以有效地处理这些情况。
定义嵌套的 Pydantic 模型:创建嵌套的 Pydantic 模型来表示表单数据。
from pydantic import BaseModel, EmailStr
class Address(BaseModel):
street: str
city: str
state: str
zip: str
class UserFormData(BaseModel):
name: str
email: EmailStr
address: Address
更新表单:更新表单以包含嵌套字段。
from fastapi import FastAPI, Form, Depends
from fastapi.responses import HTMLResponse
app = FastAPI()
@app.get("/", response_class=HTMLResponse)
async def read_form():
return """
<form action="/submit" method="post">
<input type="text" name="name" placeholder="Enter your name">
<input type="email" name="email" placeholder="Enter your email">
<input type="text" name="street" placeholder="Enter your street">
<input type="text" name="city" placeholder="Enter your city">
<input type="text" name="state" placeholder="Enter your state">
<input type="text" name="zip" placeholder="Enter your zip code">
<button type="submit">Submit</button>
</form>
"""
@app.post("/submit")
async def handle_form(name: str = Form(...), email: str = Form(...), street: str = Form(...), city: str = Form(...), state: str = Form(...), zip: str = Form(...)):
address = Address(street=street, city=city, state=state, zip=zip)
form_data = UserFormData(name=name, email=email, address=address)
return form_data.dict()
演示 2:使用表单处理多个文件上传
FastAPI 还可以在单个表单提交中处理多个文件上传。
更新表单:向表单添加多个文件上传字段。
@app.get("/", response_class=HTMLResponse)
async def read_form():
return """
<form action="/submit" method="post" enctype="multipart/form-data">
<input type="text" name="name" placeholder="Enter your name">
<input type="email" name="email" placeholder="Enter your email">
<input type="file" name="files" multiple>
<button type="submit">Submit</button>
</form>
"""
处理多个文件上传:更新 handle_form 端点以处理多个上传的文件。
from fastapi import FastAPI, Form, UploadFile, File, Depends
from typing import List
app = FastAPI()
@app.post("/submit")
async def handle_form(name: str = Form(...), email: str = Form(...), files: List[UploadFile] = File(...)):
files_data = []
for file in files:
content = await file.read()
files_data.append({"filename": file.filename, "file_size": len(content)})
return {"name": name, "email": email, "files": files_data}
演示 3:使用验证处理表单数据
您可以使用 Pydantic 的验证器对表单数据执行自定义验证。
使用验证器定义 Pydantic 模型:使用自定义验证器创建 Pydantic 模型。
from pydantic import BaseModel, EmailStr, validator
class FormDataWithValidation(BaseModel):
name: str
email: EmailStr
age: int
@validator('age')
def age_must_be_positive(cls, v):
if v <= 0:
raise ValueError('Age must be a positive integer')
return v
更新表单:创建一个包含其他验证字段的表单。
@app.get("/", response_class=HTMLResponse)
async def read_form():
return """
<form action="/submit" method="post">
<input type="text" name="name" placeholder="Enter your name">
<input type="email" name="email" placeholder="Enter your email">
<input type="number" name="age" placeholder="Enter your age">
<button type="submit">Submit</button>
</form>
"""
使用验证处理表单提交:更新 handle_form 端点以使用经过验证的 Pydantic 模型。
@app.post("/submit")
async def handle_form(form_data: FormDataWithValidation = Depends(FormDataWithValidation)):
return form_data.dict()
演示 4:使用可选字段处理表单数据
某些表单可能具有可选字段。FastAPI 允许您优雅地处理这些字段。
使用可选字段定义 Pydantic 模型:创建带有可选字段的 Pydantic 模型。
from pydantic import BaseModel, EmailStr
from typing import Optional
class OptionalFormData(BaseModel):
name: str
email: EmailStr
phone: Optional[str] = None
更新表单:创建包含可选字段的表单。
@app.get("/", response_class=HTMLResponse)
async def read_form():
return """
<form action="/submit" method="post">
<input type="text" name="name" placeholder="Enter your name">
<input type="email" name="email" placeholder="Enter your email">
<input type="text" name="phone" placeholder="Enter your phone number (optional)">
<button type="submit">Submit</button>
</form>
"""
使用可选字段处理表单提交:更新 handle_form 端点以处理可选字段。
@app.post("/submit")
async def handle_form(name: str = Form(...), email: str = Form(...), phone: Optional[str] = Form(None)):
form_data = OptionalFormData(name=name, email=email, phone=phone)
return form_data.dict()
这些演示说明了在 FastAPI 中处理表单数据的不同方式,从简单的表单提交到涉及嵌套模型、文件上传、验证和可选字段的更复杂场景。通过这些示例,您应该能够在 FastAPI 应用程序中处理各种与表单相关的任务。
在 FastAPI 中处理表单和用户输入简单而高效。借助 Form 类和 Pydantic 模型,您可以轻松验证和解析表单数据。此外,FastAPI 为文件上传提供了出色的支持,使其成为构建现代 Web 应用程序的可靠选择。
猜你喜欢
- 2024-11-17 fastapi+vue3文件上传(vue ftp上传)
- 2024-11-17 从零开始构建PDF阅读器(最简单的pdf阅读器)
- 2024-11-17 Dooring可视化之从零实现动态表单设计器
- 2024-11-17 Laravel9表单的验证(validate表单验证)
- 2024-11-17 第63节 Form表单-Web前端开发之JavaScript-王唯
- 2024-11-17 Gateway结合Sentinel1.8限流熔断及自定义异常
- 2024-11-17 手机网站常见问题总结(手机网站出现错误怎么办)
- 2024-11-17 CSS实现去除Input框默认样式的详细教程
- 2024-11-17 企业必备实战之Sentinel规则Nacos持久化
- 2024-11-17 禁用qq浏览器数字文本框 鼠标滚轮滑动 数字加减
- 标签列表
-
- content-disposition (47)
- nth-child (56)
- math.pow (44)
- 原型和原型链 (63)
- canvas mdn (36)
- css @media (49)
- promise mdn (39)
- readasdataurl (52)
- if-modified-since (49)
- css ::after (50)
- border-image-slice (40)
- flex mdn (37)
- .join (41)
- function.apply (60)
- input type number (64)
- weakmap (62)
- js arguments (45)
- js delete方法 (61)
- blob type (44)
- math.max.apply (51)
- js (44)
- firefox 3 (47)
- cssbox-sizing (52)
- js删除 (49)
- js for continue (56)
- 最新留言
-