当前位置: 首页 > news >正文

Flask-WTF 表单处理详细教程(第六阶段)

目录

  • Flask-WTF 表单处理详细教程
    • 1. 安装 Flask-WTF
    • 2. 创建 Flask 应用
    • 3. 创建表单类
      • 表单字段解释:
    • 4. 渲染表单
      • 渲染模板
      • CSRF 保护
    • 5. 表单验证
    • 6. 处理错误
    • 7. 完整示例
    • 8. 结论

Flask-WTF 表单处理详细教程

Flask-WTF 是 Flask 框架的一个扩展,简化了 Web 表单的创建、处理和验证过程。它集成了 WTForms 的功能,允许我们轻松地构建和管理 HTML 表单,并且提供了丰富的表单验证工具。本文将详细介绍如何使用 Flask-WTF,涵盖安装、创建表单、处理表单数据以及实现验证。

1. 安装 Flask-WTF

首先确保你的环境中已安装 Flask。接着,通过以下命令安装 Flask-WTF:

pip install Flask-WTF

2. 创建 Flask 应用

下面,我们将创建一个简单的 Flask 应用程序,并构建一个用户注册表单。首先,设置基本的应用框架:

from flask import Flask, render_template, redirect, url_for, flash
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Length, EqualTo
from flask_wtf.csrf import CSRFProtectapp = Flask(__name__)
app.secret_key = 'your_secret_key'  # 用于处理 session
csrf = CSRFProtect(app)  # 启用 CSRF 保护@app.route('/')
def index():return render_template('index.html')

3. 创建表单类

创建一个表单类,我们将使用 Flask-WTF 的 FlaskForm 类。该类可以定义表单字段和对应的验证器:

class RegistrationForm(FlaskForm):username = StringField('Username', validators=[DataRequired(), Length(min=2, max=20)])password = PasswordField('Password', validators=[DataRequired()])confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')])submit = SubmitField('Sign Up')

表单字段解释:

  • StringFieldPasswordField 是两种基本的表单字段类型。
  • validators 是用于验证字段输入的列表,这里我们使用了:
    • DataRequired:确保字段不为空。
    • Length:限制输入长度。
    • EqualTo:确保两个密码字段相同。

4. 渲染表单

接下来,在应用的路由中使用表单类:

@app.route('/register', methods=['GET', 'POST'])
def register():form = RegistrationForm()if form.validate_on_submit():  # 处理表单提交并验证# 处理用户注册逻辑,例如保存到数据库flash('Registration successful!', 'success')return redirect(url_for('index'))return render_template('register.html', form=form)

渲染模板

创建 register.html 来显示表单。我们将动态渲染表单字段以及可能的验证错误消息:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Register</title>
</head>
<body><h2>Register</h2><form method="POST">{{ form.hidden_tag() }}  <!-- CSRF 穿越保护 --><div>{{ form.username.label }} {{ form.username(size=32) }} {% for error in form.username.errors %}<span style="color: red;">[{{ error }}]</span>{% endfor %}</div><div>{{ form.password.label }} {{ form.password(size=32) }} {% for error in form.password.errors %}<span style="color: red;">[{{ error }}]</span>{% endfor %}</div><div>{{ form.confirm_password.label }} {{ form.confirm_password(size=32) }} {% for error in form.confirm_password.errors %}<span style="color: red;">[{{ error }}]</span>{% endfor %}</div><div>{{ form.submit() }}</div></form><a href="{{ url_for('index') }}">Back to main</a>
</body>
</html>

CSRF 保护

注意我们在表单内加入了 {{ form.hidden_tag() }} 用于生成 CSRF 保护字段。每次提交表单时,Flask-WTF 会自动验证这个 CSRF token。

5. 表单验证

在提交表单之前,Flask-WTF 会自动进行表单验证。若验证失败,视图函数将重新渲染表单页面,并显示具体的错误信息。例如,如果用户在用户名字段输入过短,页面将显示错误信息。

6. 处理错误

在 HTML 模板中,我们通过遍历字段的 errors 属性来显示错误信息,确保用户知道表单填写不正确的地方。

7. 完整示例

以下是整个应用的代码结构:

from flask import Flask, render_template, redirect, url_for, flash
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Length, EqualTo
from flask_wtf.csrf import CSRFProtectapp = Flask(__name__)
app.secret_key = 'your_secret_key'
csrf = CSRFProtect(app)class RegistrationForm(FlaskForm):username = StringField('Username', validators=[DataRequired(), Length(min=2, max=20)])password = PasswordField('Password', validators=[DataRequired()])confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')])submit = SubmitField('Sign Up')@app.route('/')
def index():return render_template('index.html')@app.route('/register', methods=['GET', 'POST'])
def register():form = RegistrationForm()if form.validate_on_submit():flash('Registration successful!', 'success')return redirect(url_for('index'))return render_template('register.html', form=form)if __name__ == '__main__':app.run(debug=True)

8. 结论

通过使用 Flask-WTF,我们能有效简化表单的创建与验证过程。本文展示了如何设置应用、定义表单、处理用户输入以及提供反馈。通过组合 WTForms 提供的各种验证器,可以根据应用需求定制各种复杂的表单。

进一步的,Flask-WTF 还支持更多的高级功能,例如文件上传、Ajax 表单处理等。你可以在 Flask-WTF 文档 中找到更多信息以扩展你的应用。希望这篇教程能够帮助你快速上手 Flask-WTF,并在你的 Flask 项目中实现强大的表单处理功能!

相关文章:

Flask-WTF 表单处理详细教程(第六阶段)

目录 Flask-WTF 表单处理详细教程1. 安装 Flask-WTF2. 创建 Flask 应用3. 创建表单类表单字段解释&#xff1a; 4. 渲染表单渲染模板CSRF 保护 5. 表单验证6. 处理错误7. 完整示例8. 结论 Flask-WTF 表单处理详细教程 Flask-WTF 是 Flask 框架的一个扩展&#xff0c;简化了 We…...

C语言 | Leetcode C语言题解之第330题按要求补齐数组

题目&#xff1a; 题解&#xff1a; int minPatches(int* nums, int numsSize, int n) {int patches 0;long long x 1;int index 0;while (x < n) {if (index < numsSize && nums[index] < x) {x nums[index];index;} else {x << 1;patches;}}retu…...

无人机之测绘行业篇

无人机倾斜摄影技术凭借快速高效、机动灵活、成本低等优势&#xff0c;正慢慢颠覆传统测绘的作业方式&#xff0c;已成为测绘行业的“新宠”&#xff0c;将倾斜摄影技术应用到无人机上&#xff0c;实际上就是在做一个三维模型&#xff0c;而建立起来的这个模型更加真实&#xf…...

Java编程:每日挑战

目录 题目1.一个抽象类并不需要其中所有的方法都是抽象的。&#xff08; &#xff09;2.下面有关java hashmap的说法错误的是&#xff1f;A. HashMap 的实例有两个参数影响其性能&#xff1a;“初始容量” 和 “加载因子”。B. HashMap 的实现不是同步的&#xff0c;意味着它不…...

【自动驾驶】ubuntu server安装桌面版

目录 安装桌面版当锁屏界面使用root用户登录错误时 这里环境一开始是ubuntu20.04服务器版本 安装桌面版 sudo apt-get update sudo apt-get upgrade apt-get install -y ubuntu-desktop # 如果你不想安装一些附加的程序&#xff0c;可用以下命令 sudo apt install --no-instal…...

前端模块化-手写mini-vite

前言 本文总结了一些关于 Vite 的工作原理&#xff0c;以及一些实现细节。 本节对应的 demo 可以在这里找到。 什么是 Vite Vite 是一个基于浏览器原生 ES imports 的开发服务器。利用浏览器去解析 imports&#xff0c;在服务器端按需编译返回&#xff0c;完全跳过了打包这个…...

SpringBoot中fastjson扩展: 自定义序列化和反序列化方法实战

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…...

【QT】鼠标按键事件 - QMouseEvent QKeyEvent

qt 事件 事件1. 事件概念2. 事件的处理3. 按键事件&#xff08;1&#xff09;单个按键&#xff08;2&#xff09;组合按键 4. 鼠标事件&#xff08;1&#xff09;鼠标单击事件&#xff08;2&#xff09;鼠标释放事件&#xff08;3&#xff09;鼠标双击事件&#xff08;4&#x…...

纯手工在内网部署一个Docker私有仓库

纯手工在内网部署一个Docker私有仓库 下载Docker仓库的镜像上传仓库的镜像导入仓库的镜像启动仓库镜像配置客户端的Docker上传镜像到本地仓库从本地仓库拉取镜像 下载Docker仓库的镜像 这个镜像不太好找&#xff0c;有需要的可以从下面的地址中下载。 通过百度网盘分享的文件…...

农林经济管理学报

《农林经济管理学报》是由江西省教育厅主管、江西农业大学主办、北京大学中国农业政策研究中心和中国人民大学农业与农村发展学院学术支持的农林经管类学术双月刊&#xff0c;以主要刊载农林经济政策与理论&#xff0c;反映农林经济管理前沿动态和研究成果&#xff0c;开展学术…...

【初阶数据结构题目】16.用队列实现栈

用队列实现栈 点击链接答题 思路&#xff1a; 出栈&#xff1a;找不为空的队列&#xff0c;将size-1个数据导入到另一个队列中。 入栈&#xff1a;往不为空队列里面插入数据 取栈顶元素&#xff1a; 例如&#xff1a; 两个队列&#xff1a; Q1&#xff1a;1 2 3Q2&#xff1a;…...

使用 OpenAI Whisper v2 模型进行中英文混合语音识别

https://huggingface.co/openai/whisper-large-v2 使用 OpenAI Whisper 模型进行中英文混合语音识别 在本篇博客中,我们将详细介绍如何使用 OpenAI 的 Whisper 模型进行中英文混合语音识别,并设置 Hugging Face 的缓存路径。 简介 Whisper 是 OpenAI 提供的一个强大的自动…...

代码随想录算法训练营day37|动态规划part05

完全背包问题&#xff1b; 第一题&#xff1a;518. Coin Change II class Solution {public int change(int amount, int[] coins) {//递推表达式int[] dp new int[amount 1];//初始化dp数组&#xff0c;表示金额为0时只有一种情况&#xff0c;也就是什么都不装dp[0] 1;fo…...

Git 如何提交代码

一. 简介 前面几篇文章简单学习了 git常用命令&#xff0c;文章如下&#xff1a; Git使用过程中涉及的几个区域-CSDN博客 Git常用命令的使用-CSDN博客 本文学习一下 如何使用 git命令&#xff0c;将本地代码提交到远程仓库。 二. 使用 git命令将本地代码提交到远程仓库中 …...

SpringBoot-application.properties为对象赋值

简单对象赋值 第一种方式 首先让该Bean交由Spring管理,然后加上ConfigurationProperties(prefix"前缀") <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId>&l…...

Head First设计模式学习笔记

Head First设计模式学习笔记 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 一、策略模式 策略模式定义了算法族&#xff0c;分别封装起来&#xff0c;让它们之间可以互相替换&#xff0c;此模式让…...

240806-RHEL 无法通过 ssh username@ip 远程连接,报错:Connection closed by ip port 22

A. 原因排查 遇到这个错误通常意味着 SSH 服务可能在目标主机上没有正常运行&#xff0c;或有防火墙/网络配置问题。以下是一些排查步骤&#xff1a; 检查 SSH 服务状态&#xff1a; 确认 SSH 服务是否正在目标主机上运行。 sudo systemctl status sshd重启 SSH 服务&#xff…...

C语言:复读机2种写法(输入什么就输出什么)

&#xff08;1&#xff09;题目&#xff1a;输入什么内容&#xff0c;输出就是什么内容&#xff0c;遇到"#"为止。输入一个随便的字符 &#xff08;2&#xff09;代码&#xff1a; 【1】getchar()和putchar() #include "stdio.h"int main() {char ch;pr…...

PySide6/PyQT学习笔记(很杂)

QGroupBox样式&#xff1a;科技机甲 QGroupBox { border: 2px solid #333; /* 深色边框&#xff0c;类似金属质感 */ border-radius: 8px; /* 轻微的圆角 */ background-color: #222; /* 暗色背景&#xff0c;模拟机甲内部或科技界面 */ color: #fff; /* 字体颜色为白色&a…...

学习笔记-JWT 保持登录状态

目录 一、解析 token 1. 在 JWT 工具类添加解析 token 的方法 2. 在 Controller 添加获取用户数据的方法 二、获取用户信息 1. 发起 axios 请求用户信息 2. 在路由守卫中调用方法 3. 使用 三、token 时效性 1. 设置 token 过期时间 2. 判断 token 是否过期 3. 在拦截…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

Python训练营-Day26-函数专题1:函数定义与参数

题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一个名为 calculate_circle_area 的函数&#xff0c;该函数接收圆的半径 radius 作为参数&#xff0c;并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求&#xff1a;函数接收一个位置参数 radi…...

数据分析六部曲?

引言 上一章我们说到了数据分析六部曲&#xff0c;何谓六部曲呢&#xff1f; 其实啊&#xff0c;数据分析没那么难&#xff0c;只要掌握了下面这六个步骤&#xff0c;也就是数据分析六部曲&#xff0c;就算你是个啥都不懂的小白&#xff0c;也能慢慢上手做数据分析啦。 第一…...