Flask(五) 表单处理 request.form、WTForms

文章目录

  • 1. 基本表单处理,使用 request.form(轻量)
    • 示例一
      • 创建 HTML 表单
      • 处理表单数据
    • 示例二
      • HTML 表单(login.html)
      • Flask 路由处理表单
  • 2. 使用 Flask-WTF 扩展
    • 安装
    • 设置 Secret Key(CSRF 防护)
    • 定义表单类
    • HTML 模板(login.html)
    • Flask 视图函数
    • ✅ 常用字段类型(WTForms)
    • ✅ 常用验证器(validators)
      • HTML 表单字段中的 URL 验证器
    • 总结
  • 3.文件上传
  • 4.处理文件上传
  • 5.AJAX 表单处理

在 Flask 中,表单处理是构建 Web 应用时一个常见的需求。用于处理用户提交的数据,比如登录、注册、搜索等。

  • 基本表单处理:使用 request.form 获取表单数据,简单直接
  • 使用 Flask-WTF:结合 WTForms 进行表单处理和验证,简化表单操作。表单验证更强大,推荐用于复杂表单。
  • 表单验证:使用验证器确保表单数据的有效性。
  • 文件上传:处理文件上传和保存文件。
  • CSRF 保护:确保表单免受跨站请求伪造攻击。

1. 基本表单处理,使用 request.form(轻量)

示例一

创建 HTML 表单

templates/form.html 文件代码:

<!DOCTYPE html>
<html>
<head><title>Form Example</title>
</head>
<body><form action="/submit" method="post"><label for="name">Name:</label><input type="text" id="name" name="name"><br><label for="email">Email:</label><input type="email" id="email" name="email"><br><input type="submit" value="Submit"></form>
</body>
</html>

action="/submit":表单数据提交到 /submit 路径。
method="post":使用 POST 方法提交数据。

处理表单数据

app.py 文件代码:

from flask import Flask, render_template, requestapp = Flask(__name__)@app.route('/')
def form():return render_template('form.html')@app.route('/submit', methods=['POST'])
def submit():name = request.form.get('name')email = request.form.get('email')return f'Name: {name}, Email: {email}'if __name__ == '__main__':app.run(debug=True)

request.form.get('name')request.form.get('email'):获取提交的表单数据。

示例二

HTML 表单(login.html)

<form method="POST" action="/login">用户名:<input type="text" name="username"><br>密码:<input type="password" name="password"><br><input type="submit" value="登录">
</form>

Flask 路由处理表单

from flask import Flask, request, render_templateapp = Flask(__name__)@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':# 从表单中获取字段值username = request.form.get('username')password = request.form.get('password')return f"你提交了:{username} / {password}"return render_template('login.html')

2. 使用 Flask-WTF 扩展

安装

pip install flask-wtf

设置 Secret Key(CSRF 防护)

Flask-WTF 自动为表单提供 CSRF 保护。你需要配置一个密钥来启用 CSRF 保护,并在模板中包含隐藏的 CSRF 令牌。

app.config['SECRET_KEY'] = 'your-secret-key'

在模板中添加 CSRF 令牌方式

<form method="post">{{ form.hidden_tag() }}<!-- Form fields here -->
</form>

定义表单类

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequiredclass LoginForm(FlaskForm):username = StringField("用户名", validators=[DataRequired()])password = PasswordField("密码", validators=[DataRequired()])submit = SubmitField("登录")

HTML 模板(login.html)

<form method="POST">{{ form.hidden_tag() }}{{ form.username.label }} {{ form.username() }}<br>{{ form.password.label }} {{ form.password() }}<br>{{ form.submit() }}
</form>

{{ form.hidden_tag() }}:生成隐藏字段,用于保护表单免受 CSRF 攻击。
{{ form.name.label }}{{ form.name(size=32) }}:渲染表单字段及其标签。

Flask 视图函数

from flask import render_template
from forms import LoginForm  # 假设你表单类定义在 forms.py@app.route('/login', methods=['GET', 'POST'])
def login():form = LoginForm()if form.validate_on_submit():username = form.username.datapassword = form.password.datareturn f"成功提交:{username} / {password}"return render_template('login.html', form=form)

validate_on_submit:检查是否是POST请求并且验证通过

✅ 常用字段类型(WTForms)

字段含义
StringField文本输入框
PasswordField密码框
SubmitField提交按钮
TextAreaField多行输入框
SelectField下拉选择
BooleanField复选框

✅ 常用验证器(validators)

验证器说明
DataRequired()必填
Length(min, max)长度限制
Email()邮箱格式验证
EqualTo()两次输入一致,比较两个字段的值(如密码确认)
NumberRange验证数字范围
Regexp使用正则表达式验证
URL验证 URL
from wtforms import Form, StringField, EmailField, SubmitField
from wtforms.validators import DataRequired, Email, Lengthclass MyForm(FlaskForm):name = StringField('Name', validators=[DataRequired(), Length(min=1, max=50)])email = EmailField('Email', validators=[DataRequired(), Email()])password = PasswordField('密码', validators=[DataRequired()])confirm_password = PasswordField('确认密码', validators=[DataRequired(), EqualTo('password')])submit = SubmitField('Submit')

HTML 表单字段中的 URL 验证器

用于 字段的前端验证:

<form><input type="url" name="website" required placeholder="请输入网址"><input type="submit">
</form>

浏览器会自动验证用户输入的内容是否是合法 URL,例如 https://example.com。

总结

用法特点
request.form简单、快速,小项目 OK
Flask-WTF自动验证、安全性高、大项目推荐

3.文件上传

Flask 还支持处理文件上传。上传的文件可以通过 request.files 访问。
创建文件上传表单

当你在表单中使用了 <input type="file"> 进行文件上传时,必须设置表单的 enctype 属性,如果 没有指定
enctype="multipart/form-data",那么上传的文件内容不会正确发送到服务器。

templates/upload.html 文件代码:

<!DOCTYPE html>
<html>
<head><title>Upload File</title>
</head>
<body><form action="/upload" method="post" enctype="multipart/form-data"><label for="file">File:</label><input type="file" id="file" name="file"><br><input type="submit" value="Upload"></form>
</body>
</html>

enctype="multipart/form-data":指定表单数据的编码类型,支持文件上传。

enctype说明
application/x-www-form-urlencoded默认值。适用于普通表单字段(文本、数字等)。
multipart/form-data用于上传文件(或含文件字段的表单)。
text/plain不常用,仅调试用途(不编码特殊字符,不推荐用于实际表单提交)。

4.处理文件上传

app.py 文件代码:

from flask import Flask, request, redirect, url_forapp = Flask(__name__)
app.secret_key = 'your_secret_key'@app.route('/upload', methods=['POST'])
def upload():file = request.files.get('file')if file:filename = file.filenamefile.save(f'uploads/{filename}')return f'File uploaded successfully: {filename}'return 'No file uploaded'if __name__ == '__main__':app.run(debug=True)

request.files.get('file'):获取上传的文件对象。
file.save(f'uploads/{filename}'):将文件保存到指定目录。

确保创建上传目录并配置上传路径:

app.config['UPLOAD_FOLDER'] = 'uploads'
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024  # 限制为16MB

5.AJAX 表单处理

@app.route('/api/submit', methods=['POST'])
def api_submit():if request.is_json:data = request.get_json()# 处理数据return jsonify({'status': 'success'})return jsonify({'status': 'error', 'message': 'Invalid request'})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/86331.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/86331.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++虚继承复习

深入理解C虚继承&#xff1a;解决菱形继承问题的利器 在C面向对象编程中&#xff0c;多重继承是一个强大但容易误用的特性。今天我们来探讨一个特殊的多重继承形式——虚继承&#xff08;Virtual Inheritance&#xff09;&#xff0c;它是解决著名的"菱形继承问题"的…

魔乐社区国产算力应用创新大赛重磅开启!

当国产算力崛起成为 AI 发展新引擎&#xff0c;你是否渴望用创新方案解锁无限可能&#xff1f;魔乐社区国产算力应用创新大赛重磅来袭&#xff01;聚焦国产算力前沿&#xff0c;无论你是开发者、研究者&#xff0c;还是技术爱好者&#xff0c;都能在这里一展身手。 现在报名参…

WebView 性能调试与优化全流程:加载速度与渲染性能双提升

移动端 WebView 页面通常用于承载复杂的前端应用&#xff0c;尤其是动态加载大量数据或进行高频率交互时&#xff0c;性能问题尤为突出。用户常常会遇到页面加载缓慢、滚动卡顿、甚至是部分内容显示不完全的情况。在这种情况下&#xff0c;如何优化数据加载与渲染过程&#xff…

51c嵌入式~CAN~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/14016935 一、CAN总线常见信号干扰问题 定位干扰原因 当总线有干扰时&#xff0c;有经验的工程师能够迅速定位&#xff0c;但是对于新手来说却很麻烦。 造成总线干扰的原因有很多&#xff0c;比如通过电磁辐射耦合到通…

【cursor实战】分析python下并行、串行计算性能

提示语 写一个Python并行计算、串行计算性能对比的代码。并行计算要包括多线程和多进程两种,计算的内容要比较复杂 模型 claude-4-sonnet 生成的代码 #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Python并行计算与串行计算性能对比程序 包含串行…

ubuntu中53端口被占用导致dnsmasq无法使用。已解决。

方案一&#xff1a;修改参数&#xff0c;但不影响使用 编辑配置文件 vim /etc/systemd/resolved.conf将此参数修改为&#xff1a; DNSStubListenerno重启服务 sudo systemctl daemon-reload sudo systemctl disable systemd-resolved.service方案一&#xff1a;直接禁用 编…

【多模态大模型】训练与推理直观解读

1.直观案例解读-图文问答 假设我们的输入是一张包含小猫的图片&#xff0c;以及一个文本提问&#xff1a;“其中是否有小猫&#xff1f;”。下面我将以最详尽的方式&#xff0c;描述数据在nanoVLM模型中从输入到输出的完整流动过程&#xff0c;并解释每一步中数据的形状和含义…

uni-app项目实战笔记17--获取系统信息getSystemInfo状态栏和胶囊按钮

接着上一篇笔记&#xff0c;在添加头部导航栏后&#xff0c;H5显示正常&#xff1a; 但在微信小程序中&#xff0c;由于刘海屏的存在&#xff0c;添加的头部导航栏跟状态栏重叠在一起&#xff1a; 因此需要获取状态栏的高度以便状态栏和导航栏错开不重叠在一起。同时头部导航栏…

Windows下Zookeeper客户端启动缓慢问题分析与解决方案

文章目录 1. 问题描述2. 问题分析2.1 性能分析2.2 根本原因 3. 解决方案3.1 临时解决方案3.2 长期解决方案 4. 注意事项5. 结论 1. 问题描述 在Windows 8.1 64-bit操作系统环境下&#xff0c;使用Curator框架连接Zookeeper时出现客户端启动异常缓慢的问题。具体表现为&#xf…

在 Java 中生成 PDF 缩略图(教程)

Java 本身无法自动生成 PDF 页面缩略图&#xff0c;但幸运的是&#xff0c;有许多软件库可以实现这一功能。本文示例使用我们自家的 JPedal 库&#xff0c;仅需几行 Java 代码即可创建缩略图。JPedal 是开发者使用的最佳 Java PDF 库。 如何使用 JPedal 将 PDF 转换为缩略图 …

基于大模型的甲状腺结节预测及综合诊疗技术方案大纲

目录 一、技术方案概述二、术前预测与方案制定2.1 结节特征分析与良恶性预测2.2 手术方案建议2.3 麻醉方案优化三、术中辅助决策3.1 实时数据监测与分析3.2 麻醉深度监控与调节四、术后护理与并发症预测4.1 术后恢复预测4.2 并发症风险预警五、统计分析与技术验证5.1 数据分割与…

SpringCloud系列(36)--SpringCloud Gateway简介

1、SpringCloud GateWay概述 SpringCloud Gateway是 Spring Cloud的一个全新项目&#xff0c;基于Spring 5.0Spring Boot 2.0和Project Reactor等技术开发的网关&#xff0c;它旨在为微服务架构提供一种简单有效的统—的API路由管理方式&#xff1b;SpringCloud Gateway作为Sp…

TensorFlow深度学习实战:构建神经网络全指南

引言&#xff1a;深度学习与TensorFlow概览 深度学习作为机器学习的一个重要分支&#xff0c;近年来在计算机视觉、自然语言处理、语音识别等领域取得了突破性进展。TensorFlow是由Google Brain团队开发的开源深度学习框架&#xff0c;自2015年发布以来&#xff0c;已成为最受…

K8S: etcdserver: too many requests

Kubernetes etcdserver: too many requests 错误解决方案 当Kubernetes集群出现 etcdserver: too many requests 错误时&#xff0c;表明etcd数据库接收到的请求量超过了其处理能力。etcd作为Kubernetes的核心组件&#xff0c;存储着集群的所有状态数据&#xff0c;处理请求过…

银河麒麟高级服务器操作系统(全架构)OpenGauss 数据库部署手册

一、部署前准备工作 1. 环境检查 项目配置描述内存功能调试建议 32GB 以上。性能测试和商业部署时&#xff0c;单实例部署建议 128GB 以上。复杂的查询对内存的需求量比较高&#xff0c;在高并发场景下&#xff0c;可能出现内存不足。此时建议使用大内存的机器&#xff0c;或…

Boosting:从理论到实践——集成学习中的偏差征服者

核心定位&#xff1a;一种通过串行训练弱学习器、自适应调整数据权重&#xff0c;将多个弱模型组合成强模型的集成学习框架&#xff0c;专注于降低预测偏差。 本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千A…

Ubuntu下交叉编译工业相机库aravis到OpenHarmony(aarch64)使用

文章目录 下载交叉编译工具链安装meson编写交叉编译配置文件编译glib编译libiconv编译libxml2编译libusb&#xff08;暂时不编译&#xff0c;依赖的udev库我找不到&#xff09;编译Aravis使用 自行编译的库都统一放到一个地方去&#xff0c;这样引用时方便一些&#xff0c;比如…

深入理解互斥信号量(Mutex)在 FreeRTOS 中的使用与实现

在多任务操作系统中&#xff0c;任务间的同步和资源共享是至关重要的。为了避免多个任务同时访问共享资源&#xff0c;导致资源冲突和数据不一致&#xff0c;信号量&#xff08;Semaphore&#xff09; 是常用的同步机制。特别是在 FreeRTOS 中&#xff0c;互斥信号量&#xff0…

Liunx操作系统笔记2

Linux下的包/源管理命令&#xff1a;主要任务是完成在Linux环境下安装软件。 1.rpm 是最基础的rpm包的安装命令&#xff0c;需要提前下载相关安装包和依赖包。 2.yum/dnf是基于rpm包的自动安装命令&#xff0c;可以自动在仓库中匹配安装软件和依赖包。 3.光盘源 是指的 安装系统…

企业级RAG系统架构设计与实现指南(Java技术栈)

企业级RAG系统架构设计与实现指南&#xff08;Java技术栈&#xff09; 开篇&#xff1a;RAG系统的基本概念与企业应用价值 在当今快速发展的AI技术背景下&#xff0c;检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09; 已成为构建智能问答、知识库管…