Flask中使用WTForms處理表單驗證

在 Flask 中,WTForms 是一個用于 處理表單驗證 的庫,可以與 Flask 結合,提供表單驗證、數據清理、錯誤提示等功能。


1. 安裝 Flask-WTF

首先安裝 Flask-WTF

pip install Flask-WTF

Flask-WTFWTForms 的 Flask 擴展,提供了 CSRF 保護Flask 兼容的表單處理


2. 基本使用

(1) 創建 Flask 應用

from flask import Flask, render_template, request, redirect, flash
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Length, Email, EqualToapp = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'  # 必須設置,否則 CSRF 保護無法使用

(2) 定義表單

使用 FlaskForm 繼承 WTForms,定義表單字段和驗證規則:

class LoginForm(FlaskForm):email = StringField('郵箱', validators=[DataRequired(), Email()])password = PasswordField('密碼', validators=[DataRequired(), Length(min=6, max=12)])submit = SubmitField('登錄')

? DataRequired() 不能為空
? Email() 必須是合法郵箱格式
? Length(min=6, max=12) 密碼長度 6-12 位


(3) 創建視圖

表單處理邏輯

@app.route('/login', methods=['GET', 'POST'])
def login():form = LoginForm()if form.validate_on_submit():  # 檢查表單是否有效email = form.email.datapassword = form.password.dataflash(f'用戶 {email} 登錄成功', 'success')return redirect('/success')  # 登錄成功跳轉return render_template('login.html', form=form)

? form.validate_on_submit() 自動檢查 POST 數據是否符合驗證規則
? flash() 用于在前端顯示錯誤或成功信息
? form.email.data 獲取表單數據


(4) 編寫 HTML 表單

templates/login.html

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>登錄</title>
</head>
<body><h1>登錄</h1>{% with messages = get_flashed_messages(with_categories=true) %}{% if messages %}{% for category, message in messages %}<p style="color: {{ 'green' if category == 'success' else 'red' }}">{{ message }}</p>{% endfor %}{% endif %}{% endwith %}<form method="POST">{{ form.hidden_tag() }}  {# CSRF 保護 #}<p>{{ form.email.label }} <br>{{ form.email(size=30) }} <br>{% for error in form.email.errors %}<span style="color:red;">{{ error }}</span>{% endfor %}</p><p>{{ form.password.label }} <br>{{ form.password(size=30) }} <br>{% for error in form.password.errors %}<span style="color:red;">{{ error }}</span>{% endfor %}</p><p>{{ form.submit() }}</p></form>
</body>
</html>

? {{ form.hidden_tag() }} 用于 CSRF 保護
? form.email(size=30) 渲染表單輸入框
? for error in form.email.errors 顯示驗證錯誤


3. 復雜表單示例(注冊表單)

支持 兩次密碼一致性驗證

class RegisterForm(FlaskForm):username = StringField('用戶名', validators=[DataRequired(), Length(min=3, max=20)])email = StringField('郵箱', validators=[DataRequired(), Email()])password = PasswordField('密碼', validators=[DataRequired(), Length(min=6, max=12)])confirm_password = PasswordField('確認密碼', validators=[DataRequired(), EqualTo('password', message="兩次密碼不一致")])submit = SubmitField('注冊')

? EqualTo('password') 驗證兩次密碼一致
? message="兩次密碼不一致" 自定義錯誤提示

注冊視圖:

@app.route('/register', methods=['GET', 'POST'])
def register():form = RegisterForm()if form.validate_on_submit():flash(f'用戶 {form.username.data} 注冊成功', 'success')return redirect('/login')return render_template('register.html', form=form)

4. 自定義驗證器

可以自定義表單驗證邏輯。例如:檢查用戶名是否已存在

from wtforms.validators import ValidationErrorclass UniqueUsername:"""自定義驗證器,檢查用戶名是否已被使用"""def __init__(self, message=None):if not message:message = "該用戶名已被占用"self.message = messagedef __call__(self, form, field):existing_users = ["admin", "test"]  # 假設數據庫已有的用戶名if field.data in existing_users:raise ValidationError(self.message)class RegisterForm(FlaskForm):username = StringField('用戶名', validators=[DataRequired(), Length(min=3, max=20), UniqueUsername()])email = StringField('郵箱', validators=[DataRequired(), Email()])password = PasswordField('密碼', validators=[DataRequired(), Length(min=6, max=12)])confirm_password = PasswordField('確認密碼', validators=[DataRequired(), EqualTo('password')])submit = SubmitField('注冊')

? UniqueUsername() 檢查用戶名是否已注冊
? raise ValidationError(self.message) 觸發錯誤


5. 結論

  1. Flask-WTFWTForms 的 Flask 擴展,提供 表單驗證、CSRF 保護
  2. FlaskForm 定義表單字段 & 驗證規則,如 DataRequired()Email()
  3. form.validate_on_submit() 自動檢查表單數據
  4. HTML 使用 form.hidden_tag() 保護 CSRF,用 form.errors 顯示錯誤
  5. 支持自定義驗證器,如檢查用戶名是否唯一。

Flask + WTForms 讓表單驗證更安全、更易用!🚀

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/73605.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/73605.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/73605.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

24.策略模式實現日志

日志的介紹 計算機中的日志是記錄系統和軟件運行中發送事件的文件&#xff0c;主要作用是監控運行狀態、記錄異常信息&#xff0c;幫助快速定位問題并支持程序員進行問題修復。它是系統維護、故障排查和安全管理的重要工具。 日志格式以下幾個指標是必須得有的&#xff1a; ?…

【網絡】簡單的 Web 服務器架構解析,包含多個服務和反向代理的配置,及非反向代理配置

這張圖片描述了一個簡單的 Web 服務器架構&#xff0c;包含多個服務和反向代理的配置。以下是對每個部分的詳細解釋&#xff0c;幫助你理解其中的技術內容&#xff1a; 1. Web Server: ifn666.com 這是你的主域名&#xff08;ifn666.com&#xff09;&#xff0c;所有服務都通過…

???????大語言模型安全風險分析及相關解決方案

大語言模型的安全風險可以從多個維度進行分類。 從輸入輸出的角度來看,存在提示注入、不安全輸出處理、惡意內容生成和幻覺錯誤等風險; 從數據層面來看,訓練數據中毒、敏感信息泄露和模型反演攻擊是主要威脅; 模型自身則面臨拒絕服務和盜竊的風險; 供應鏈和插件的不安全引…

貪心算法——c#

貪心算法通俗解釋 貪心算法是一種"每一步都選擇當前最優解"的算法策略。它不關心全局是否最優&#xff0c;而是通過局部最優的累積來逼近最終解。優點是簡單高效&#xff0c;缺點是可能無法得到全局最優解。 一句話秒懂 自動售貨機找零錢&#xff1a;用最少數量的…

STM32 - 在機器人領域,LL庫相比HAL優勢明顯

在機器人控制器、電機控制器等領域的開發&#xff0c;需要高實時性、精細化控制或者對代碼執行效率、占用空間有較高要求。所以&#xff0c;大家常用的HAL庫明顯不符合要求。再加上&#xff0c;我們學習一門技術&#xff0c;一定要學會掌握底層的原理。MCU開發的底層就是寄存器…

【計算機網絡】2物理層

物理層任務:實現相鄰節點之間比特(或)的傳輸 1.通信基礎 1.1.基本概念 1.1.1.信源,信宿,信道,數據,信號 數據通信系統主要劃分為信源、信道、信宿三部分。 信源:產生和發送數據的源頭。 信宿:接收數據的終點。 信道:信號的傳輸介質。 數據和信號都有模擬或數字…

deepseek GRPO算法保姆級講解(數學原理+源碼解析+案例實戰)

文章目錄 什么是GRPO群組形成(Group Formation):讓大模型創建多種解決方案偏好學習(Preference Learning)&#xff1a;讓大模型理解何為好的解答組內相對優勢 優化(optimization): 讓大模型從經驗中學習(learning from experience)目標函數 GRPO算法的偽碼表示GRPO算法的局限與…

使用 WebP 優化 GPU 紋理占用

WebP 格式相比 JPEG / PNG 文件更小&#xff0c;可以 減少 GPU 紋理內存占用&#xff0c;提高 WebGL / Three.js / 3D 渲染 的性能。 &#x1f539; 為什么 WebP 能減少 GPU 內存占用&#xff1f; 文件更小 → WebP 比 JPG/PNG 壓縮率更高&#xff0c;減少 紋理上傳 帶寬&…

Google Cloud Run 如何實現無服務器(Serverless)部署?

DDoS&#xff08;分布式拒絕服務&#xff09;攻擊是黑客常用的一種手段&#xff0c;通過大量惡意流量沖擊服務器&#xff0c;導致網站無法訪問。針對這種威脅&#xff0c;Cloudflare提供了一整套防護措施&#xff0c;包括流量過濾、速率限制、防火墻規則等&#xff0c;使網站能…

QuickAPI 和 DBAPI 誰更香?SQL生成API工具的硬核對比(一)

最近低代碼開發火得不行&#xff0c;尤其是能把數據庫秒變API的工具&#xff0c;簡直是開發者的救星。今天咱就聊聊兩款國內玩家&#xff1a;QuickAPI&#xff08;麥聰軟件搞出來的低代碼神器&#xff09;和 DBAPI&#xff08;開源社區的硬核作品&#xff09;。這兩貨都能靠SQL…

BigEvent項目后端學習筆記(一)用戶管理模塊 | 注冊登錄與用戶信息全流程解析(含優化)

&#x1f4d6; 模塊概述 用戶管理模塊是系統的核心基礎模塊&#xff0c;包含 注冊、登錄、用戶信息維護 等功能。本模塊涉及 JWT Token認證、密碼加密存儲、文件上傳 等關鍵技術點&#xff0c;是理解前后端分離架構中安全與數據交互的典型實踐。本篇對于原項目進行了代碼優化&…

c#:使用串口通訊實現數據的發送和接收

串口通訊&#xff08;Serial Communication&#xff09;是一種常見的硬件設備與計算機之間的數據傳輸方式&#xff0c;廣泛應用于工業控制、嵌入式系統、傳感器數據采集等領域。本文將詳細介紹如何使用C#實現基于串口通訊的數據發送和接收&#xff0c;并結合代碼示例解析其實現…

k8s面經

最近面了幾場&#xff0c;k8s技能幾乎成了運維的必備品了。 容器一直pending可能的原因調度問題。容器的調度策略&#xff0c;比如標簽選擇、容忍度或者親和度&#xff0c;導致沒有合適的節點可供調度 資源問題&#xff0c;比如宿主機的CPU內存磁盤不足&#xff0c;或者要掛載…

網絡通信(傳輸層協議:TCP/IP ,UDP):

Socket是對網絡中不同主機上的應用進程之間進行雙向通信的端點的抽象。一個套接字就是網絡上進程通信的一端&#xff0c;提供了應用層進程利用網絡協議交換數據的機制。 網絡協議&#xff1a;一臺電腦的數據怎么傳遞給另一臺電腦&#xff0c;是由網絡協議來規定的 端口號&#…

DeepSeek進階應用(二):結合Kimi制作PPT(雙AI協作教程)

&#x1f31f;引言&#xff1a; DeepSeek作為國產AI大模型&#xff0c;以強大的邏輯推理和結構化內容生成能力著稱&#xff0c;擅長根據用戶需求生成PPT大綱或Markdown文本&#xff1b;Kimi的PPT助手則能解析結構化內容并套用模板快速生成美觀的PPT&#xff0c;兩者結合實現“內…

卷積神經網絡(知識點)

一、為了使特征圖變小&#xff1a; 由兩種方法&#xff1a;1.增大步長&#xff1a;卷積的時候不是一次一步&#xff0c;而是一次多步&#xff0c;類似一張圖片&#xff0c;在原來的像素基礎上&#xff0c;每隔一個取一個像素點。 其中S就是步長 注意&#xff1a;擴大步長不經…

考研系列-408真題計算機網絡篇(18-23)

寫在前面 此文章是本人在備考過程中408真題計算機網絡部分&#xff08;2018年-2023年&#xff09;的易錯題及相應的知識點整理&#xff0c;后期復習也常常用到&#xff0c;對于知識提煉歸納理解起到了很大的作用&#xff0c;分享出來希望幫助到大家~ # 2018 1.停止-等待協議的…

std::invoke詳解

基礎介紹 c17版本引入了std::invoke特性&#xff0c;這是一個通用的調用包裝器&#xff0c;可以統一調用&#xff1a; 普通函數成員函數函數對象Lambda表達式指向成員的指針 它的主要作用是提供一個統一的方式來調用各種可調用對象。 std::invoke依賴的頭文件&#xff1a;#…

使用 PaddleNLP 在 CPU(支持 AVX 指令)下跑通 llama2-7b或DeepSeek-r1:1.5b 模型(完成度80%)

原文&#xff1a;&#x1f6a3;?♂? 使用 PaddleNLP 在 CPU(支持 AVX 指令)下跑通 llama2-7b 模型 &#x1f6a3; — PaddleNLP 文檔 使用 PaddleNLP 在 CPU(支持 AVX 指令)下跑通 llama2-7b 模型 &#x1f6a3; PaddleNLP 在支持 AVX 指令的 CPU 上對 llama 系列模型進行了…

Kotlin高效實現 Android ViewPager2 頂部導航:動態配置與性能優化指南

高效實現&#xff1a;強調代碼的性能優化。Android ViewPager2&#xff1a;明確技術棧。頂部導航&#xff1a;核心功能點。動態配置與性能優化指南&#xff1a;突出動態配置的靈活性和性能優化的重點。 在 Android 開發中&#xff0c;使用 ViewPager2 實現高效的頂部導航&…