在 FastAPI 中处理表单和用户输入:验证用户输入
yuyutoo 2024-10-11 21:40 1 浏览 0 评论
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于基于标准 Python 类型提示使用 Python 3.7+ 构建 API。FastAPI 的突出功能之一是它能够使用 Python 类型提示和 Pydantic 模型自动验证用户输入。在本博客中,我们将探讨如何在 FastAPI 中处理表单和用户输入,以及如何有效地验证用户输入。
简介
在构建 Web 应用程序时,处理用户输入是一个关键方面。确保从用户那里收到的数据有效且安全对于应用程序的稳定性和安全性至关重要。FastAPI 通过利用 Pydantic 模型和 Python 类型提示来执行自动数据验证和序列化,简化了此过程。
设置 FastAPI
首先,让我们设置一个基本的 FastAPI 应用程序。您可以使用 pip 安装 FastAPI 和 Uvicorn(ASGI 服务器):
pip install fastapi uvicorn
创建一个名为 main.py 的文件并添加以下代码来设置基本的 FastAPI 应用程序:
from fastapi import FastAPI, Form
from pydantic import BaseModel
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Welcome to FastAPI"}
处理表单数据
要处理 FastAPI 中的表单数据,我们可以使用 fastapi 中的 Form 类。此类允许我们从请求中提取表单数据并将其作为函数参数传递给端点。
以下是如何处理简单登录表单的示例:
from fastapi import FastAPI, Form
app = FastAPI()
@app.post("/login/")
def login(username: str = Form(...), password: str = Form(...)):
return {"username": username}
在此示例中,我们定义了一个 POST 端点 /login/,它接受两个表单参数:用户名和密码。Form(...) 语法表示应从表单数据中提取这些参数。
使用 Pydantic 模型验证用户输入
FastAPI 使用 Pydantic 模型执行数据验证。Pydantic 模型允许我们定义我们期望的数据的结构和约束,并且 FastAPI 将根据这些模型自动验证传入的数据。
以下是如何使用 Pydantic 模型进行输入验证的示例:
from fastapi import FastAPI
from pydantic import BaseModel, Field
app = FastAPI()
class User(BaseModel):
username: str
password: str
@app.post("/login/")
def login(user: User):
return {"username": user.username}
在此示例中,我们定义了一个包含用户名和密码字段的 User 模型。登录端点接受 User 对象,FastAPI 将自动根据 User 模型验证传入的数据。
使用 Pydantic 进行高级验证
Pydantic 提供了广泛的验证选项,包括字段约束、自定义验证器和复杂的嵌套模型。以下是一些示例:
字段约束
您可以使用 Field 函数向字段添加约束:
from pydantic import BaseModel, Field
class User(BaseModel):
username: str = Field(..., min_length=3, max_length=50)
password: str = Field(..., min_length=8)
在此示例中,我们指定用户名字段的长度必须在 3 到 50 个字符之间,密码字段的长度必须至少为 8 个字符。
自定义验证器
您可以使用 Pydantic 的验证器装饰器定义自定义验证器:
from pydantic import BaseModel, Field, validator
class User(BaseModel):
username: str = Field(..., min_length=3, max_length=50)
password: str = Field(..., min_length=8)
email: str
@validator("email")
def validate_email(cls, value):
if "@" not in value:
raise ValueError("Invalid email address")
return value
在此示例中,我们为电子邮件字段定义自定义验证器,以确保它包含 @ 符号。
使用 Pydantic 模型处理表单数据
您可以将表单数据处理与 Pydantic 模型结合起来以验证表单数据:
from fastapi import FastAPI, Form
from pydantic import BaseModel
app = FastAPI()
class User(BaseModel):
username: str
password: str
@app.post("/login/")
def login(username: str = Form(...), password: str = Form(...)):
user = User(username=username, password=password)
return {"username": user.username}
在此示例中,我们使用 Form 类提取表单数据,然后创建一个 User 对象来验证数据。
让我们深入了解一些有关在 FastAPI 中处理表单和用户输入的其他演示,重点介绍更高级的验证场景、处理嵌套数据以及处理文件上传和表单数据。
演示 1:使用正则表达式进行高级字段验证
在此演示中,我们将创建一个用于用户注册的表单,其中密码必须遵循特定模式(例如,至少一个大写字母、一个小写字母和一个数字)。
from fastapi import FastAPI, Form
from pydantic import BaseModel, Field, validator
import re
app = FastAPI()
class UserRegistration(BaseModel):
username: str = Field(..., min_length=3, max_length=50)
password: str
@validator("password")
def validate_password(cls, value):
if not re.match(r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[A-Za-z\d]{8,}#39;, value):
raise ValueError("Password must contain at least one uppercase letter, one lowercase letter, and one number")
return value
@app.post("/register/")
def register(username: str = Form(...), password: str = Form(...)):
user = UserRegistration(username=username, password=password)
return {"message": "User registered successfully", "username": user.username}
演示 2:处理嵌套数据
此演示展示了如何处理嵌套表单数据。假设我们有一个用于创建包含嵌套地址信息的用户个人资料的表单。
from fastapi import FastAPI, Form
from pydantic import BaseModel, Field
app = FastAPI()
class Address(BaseModel):
street: str = Field(..., min_length=3, max_length=100)
city: str = Field(..., min_length=2, max_length=50)
zip_code: str = Field(..., min_length=5, max_length=10)
class UserProfile(BaseModel):
username: str = Field(..., min_length=3, max_length=50)
address: Address
@app.post("/create-profile/")
def create_profile(username: str = Form(...), street: str = Form(...), city: str = Form(...), zip_code: str = Form(...)):
address = Address(street=street, city=city, zip_code=zip_code)
profile = UserProfile(username=username, address=address)
return {"message": "Profile created successfully", "profile": profile.dict()}
演示 3:结合文件上传和表单数据
在此演示中,我们将处理文件上传和表单数据。例如,让我们创建一个端点来上传个人资料图片以及用户详细信息。
from fastapi import FastAPI, File, UploadFile, Form
from pydantic import BaseModel, Field
app = FastAPI()
class UserDetails(BaseModel):
username: str = Field(..., min_length=3, max_length=50)
bio: str = Field(..., max_length=500)
@app.post("/upload-profile/")
async def upload_profile(username: str = Form(...), bio: str = Form(...), file: UploadFile = File(...)):
user_details = UserDetails(username=username, bio=bio)
file_content = await file.read()
return {
"message": "Profile uploaded successfully",
"user_details": user_details.dict(),
"filename": file.filename,
"file_size": len(file_content)
}
演示 4:使用依赖项进行验证
FastAPI 允许您使用依赖项进行验证和业务逻辑分离。在此演示中,我们将创建自定义依赖项来验证用户输入。
from fastapi import FastAPI, Depends, HTTPException
from pydantic import BaseModel, Field
app = FastAPI()
class User(BaseModel):
username: str = Field(..., min_length=3, max_length=50)
password: str = Field(..., min_length=8)
def validate_user(username: str, password: str):
if username == "admin":
raise HTTPException(status_code=400, detail="Username 'admin' is not allowed")
return User(username=username, password=password)
@app.post("/validate-user/")
def validate_user_endpoint(user: User = Depends(validate_user)):
return {"message": "User is valid", "username": user.username}
演示 5:验证查询参数
在此演示中,我们将使用 Pydantic 模型验证查询参数。这对于需要在 URL 中传递参数的端点很有用。
from fastapi import FastAPI, Query
from pydantic import BaseModel, Field
app = FastAPI()
class QueryParams(BaseModel):
search: str = Field(..., min_length=3)
page: int = Field(1, gt=0)
size: int = Field(10, gt=0, le=100)
@app.get("/search/")
def search_items(params: QueryParams = Depends()):
return {"search": params.search, "page": params.page, "size": params.size}
这些演示说明了在 FastAPI 中处理和验证用户输入的各种方法。通过利用 Pydantic 模型和 FastAPI 的依赖注入系统,您可以确保您的应用程序有效且安全地处理和验证用户输入。
FastAPI 利用 Python 类型提示和 Pydantic 模型进行数据验证,使表单和用户输入的处理变得简单而安全。通过定义数据的结构和约束,您可以确保您的应用程序从用户那里收到有效且格式正确的输入。
在本博客中,我们介绍了处理表单数据、使用 Pydantic 模型验证用户输入以及实施高级验证技术的基础知识。使用 FastAPI,您可以构建强大而可靠的 Web 应用程序,以高效、安全地处理用户输入。
相关推荐
- jQuery VS AngularJS 你更钟爱哪个?
-
在这一次的Web开发教程中,我会尽力解答有关于jQuery和AngularJS的两个非常常见的问题,即jQuery和AngularJS之间的区别是什么?也就是说jQueryVSAngularJS?...
- Jquery实时校验,指定长度的「负小数」,小数位未满末尾补0
-
在可以输入【负小数】的输入框获取到焦点时,移除千位分隔符,在输入数据时,实时校验输入内容是否正确,失去焦点后,添加千位分隔符格式化数字。同时小数位未满时末尾补0。HTML代码...
- 如何在pbootCMS前台调用自定义表单?pbootCMS自定义调用代码示例
-
要在pbootCMS前台调用自定义表单,您需要在后台创建表单并为其添加字段,然后在前台模板文件中添加相关代码,如提交按钮和表单验证代码。您还可以自定义表单数据的存储位置、添加文件上传字段、日期选择器、...
- 编程技巧:Jquery实时验证,指定长度的「负小数」
-
为了保障【负小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【负小数】的方法。HTML代码<inputtype="text"class="forc...
- 一篇文章带你用jquery mobile设计颜色拾取器
-
【一、项目背景】现实生活中,我们经常会遇到配色的问题,这个时候去百度一下RGB表。而RGB表只提供相对于的颜色的RGB值而没有可以验证的模块。我们可以通过jquerymobile去设计颜色的拾取器...
- 编程技巧:Jquery实时验证,指定长度的「正小数」
-
为了保障【正小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【正小数】的方法。HTML做成方法<inputtype="text"class="fo...
- jquery.validate检查数组全部验证
-
问题:html中有多个name[],每个参数都要进行验证是否为空,这个时候直接用required:true话,不能全部验证,只要这个数组中有一个有值就可以通过的。解决方法使用addmethod...
- Vue进阶(幺叁肆):npm查看包版本信息
-
第一种方式npmviewjqueryversions这种方式可以查看npm服务器上所有的...
- layui中使用lay-verify进行条件校验
-
一、layui的校验很简单,主要有以下步骤:1.在form表单内加上class="layui-form"2.在提交按钮上加上lay-submit3.在想要校验的标签,加上lay-...
- jQuery是什么?如何使用? jquery是什么功能组件
-
jQuery于2006年1月由JohnResig在BarCampNYC首次发布。它目前由TimmyWilson领导,并由一组开发人员维护。jQuery是一个JavaScript库,它简化了客户...
- django框架的表单form的理解和用法-9
-
表单呈现...
- jquery对上传文件的检测判断 jquery实现文件上传
-
总体思路:在前端使用jquery对上传文件做部分初步的判断,验证通过的文件利用ajaxFileUpload上传到服务器端,并将文件的存储路径保存到数据库。<asp:FileUploadI...
- Nodejs之MEAN栈开发(四)-- form验证及图片上传
-
这一节增加推荐图书的提交和删除功能,来学习node的form提交以及node的图片上传功能。开始之前需要源码同学可以先在git上fork:https://github.com/stoneniqiu/R...
- 大数据开发基础之JAVA jquery 大数据java实战
-
上一篇我们讲解了JAVAscript的基础知识、特点及基本语法以及组成及基本用途,本期就给大家带来了JAVAweb的第二个知识点jquery,大数据开发基础之JAVAjquery,这是本篇文章的主要...
- 推荐四个开源的jQuery可视化表单设计器
-
jquery开源在线表单拖拉设计器formBuilder(推荐)jQueryformBuilder是一个开源的WEB在线html表单设计器,开发人员可以通过拖拉实现一个可视化的表单。支持表单常用控件...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)