编程技术文章分享与教程

网站首页 > 技术文章 正文

在 FastAPI 中处理表单和用户输入:综合指南

hmc789 2024-11-17 11:23:01 技术文章 2 ℃

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 应用程序的可靠选择。

标签列表
最新留言