flask处理表单数据

在这里插入图片描述

flask处理表单数据

处理表单数据在任何 web 应用开发中都是一个常见的需求。在 Flask 中,你可以使用 request 对象来获取通过 HTTP 请求发送的数据。对于 POST 请求,可以通过 request.form 访问表单数据。例如:

from flask import Flask, requestapp = Flask(__name__)@app.route('/login', methods=['POST'])
def login():username = request.form['username']password = request.form['password']# 这里可以处理验证等逻辑

然而,上述方法只提供了基本的表单处理能力,如果你需要更复杂的功能,如表单验证、CSRF 保护等,你可能需要使用 Flask 的扩展库,如 Flask-WTF 或 Flask-Forms。

Flask-WTF 是一个集成了 WTForms 的 Flask 扩展,提供了方便易用的表单类和表单验证功能。以下是一个使用 Flask-WTF 处理表单的例子:

from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequiredapp = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'  # 用于启用 CSRF 保护class LoginForm(FlaskForm):username = StringField('Username', validators=[DataRequired()])password = PasswordField('Password', validators=[DataRequired()])submit = SubmitField('Login')@app.route('/login', methods=['GET', 'POST'])
def login():form = LoginForm()if form.validate_on_submit():username = form.username.datapassword = form.password.data# 这里可以处理验证等逻辑return render_template('login.html', form=form)

在上述例子中,我们定义了一个表单类 LoginForm,其中包含了用户名和密码字段以及一个提交按钮。我们使用了 WTForms 的验证器 DataRequired 来确保表单字段不为空。在 login 视图函数中,我们首先实例化 LoginForm,然后检查表单是否被提交并验证通过,如果是的话,我们就可以处理表单数据了。最后,我们渲染表单的 HTML 页面。

请注意,上述例子假设你有一个名为 login.html 的模板文件,用于渲染表单。在这个文件中,你需要使用 WTForms 提供的函数来生成表单的 HTML。例如:

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

在这个例子中,form.hidden_tag() 生成了 CSRF 令牌,form.username()form.password() 生成了输入框,form.submit() 生成了提交按钮。

总结工作流程可以大致总结如下:

  1. 定义表单类:在 Python 代码中创建一个继承自 FlaskForm 的类(如果使用 Flask-WTF)或 Form(如果使用 WTForms)。在这个类中定义表单的各个字段,例如字符串字段、密码字段、提交按钮等。同时,你也可以定义验证规则,如必填字段、长度限制等。
  2. 创建视图函数:在 Flask 的视图函数中,创建表单类的实例,并在适当的时候调用它的 validate_on_submit() 方法来检查表单是否被提交且数据是否有效。如果表单数据有效,那么你就可以取出数据并进行相应的处理,例如登陆验证、数据存储等。
  3. 渲染表单:在视图函数中,使用 render_template() 函数将表单对象传递到模板中。然后,在 HTML 模板中使用 Flask 的模板语言(Jinja2)来渲染表单的各个部分,包括标签、输入框、错误消息等。
  4. 处理表单提交:当用户填写完表单并点击提交按钮时,浏览器会发送一个 POST 请求到服务器。Flask 应用会接收到这个请求,并触发相应的视图函数。视图函数会再次检查表单数据的有效性,如果数据有效,就会进行相应的处理(例如登陆验证、数据存储等)。否则,它将重新渲染表单,并显示错误消息。
  5. 显示反馈:处理完表单数据后,应用通常会给出相应的反馈,例如显示一个成功的消息,或者重定向用户到另一个页面。如果表单数据无效,应用通常会显示错误消息,并让用户重新填写表单。

补充修改

from flask import Flask, render_template, request, redirect, url_for, flash
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequiredapp = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'  # 用于启用 CSRF 保护class LoginForm(FlaskForm):username = StringField('Username', validators=[DataRequired()])password = PasswordField('Password', validators=[DataRequired()])submit = SubmitField('Login')@app.route('/login', methods=['GET', 'POST'])
def login():form = LoginForm()if form.validate_on_submit():username = form.username.datapassword = form.password.data# 在这里处理验证等逻辑# 假设我们的系统中有一个验证用户的函数 check_userif check_user(username, password):flash('Login success!')return redirect(url_for('index'))else:flash('Invalid username or password.')return render_template('login.html', form=form)def check_user(username, password):# 这只是一个假设的函数,实际情况中你需要根据你的应用验证用户return username == 'admin' and password == 'secret'

form.validate_on_submit() 将在表单提交(即 POST 请求到来)时检查表单数据,并返回 True。然后,我们就可以从表单对象中提取出数据,进行进一步的处理,例如检查用户名和密码是否正确。

因此,尽管代码中没有明确的 if request.method == 'POST' 判断,我们实际上还是在处理 POST 请求。这是因为 Flask-WTF 的 form.validate_on_submit() 已经帮我们完成了这个判断。

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

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

相关文章

IDEA中连接虚拟机 管理Docker

IDEA中连接虚拟机 管理Docker &#x1f4d4; 千寻简笔记介绍 千寻简笔记已开源&#xff0c;Gitee与GitHub搜索chihiro-notes&#xff0c;包含笔记源文件.md&#xff0c;以及PDF版本方便阅读&#xff0c;且是用了精美主题&#xff0c;阅读体验更佳&#xff0c;如果文章对你有帮…

【点云处理教程】00计算机视觉的Open3D简介

一、说明 Open3D 是一个开源库&#xff0c;使开发人员能够处理 3D 数据。它提供了一组用于 3D 数据处理、可视化和机器学习任务的工具。该库支持各种数据格式&#xff0c;例如 .ply、.obj、.stl 和 .xyz&#xff0c;并允许用户创建自定义数据结构并在程序中访问它们。 Open3D 广…

KafKa脚本操作

所有操作位于/usr/local/kafka_2.12-3.5.1/bin。 rootubuntu2203:/usr/local/kafka_2.12-3.5.1/bin# pwd /usr/local/kafka_2.12-3.5.1/bin rootubuntu2203:/usr/local/kafka_2.12-3.5.1/bin# ls connect-distributed.sh kafka-delegation-tokens.sh kafka-mirror-mak…

15. Spring AOP 的实现原理 代理模式

目录 1. 代理模式 2. 静态代理 3. 动态代理 3.1 JDK 动态代理 3.2 CGLIB 动态代理 4. JDK 动态代理和 CGLIB 动态代理对比 5. Spring代理选择 6. Spring AOP 实现原理 6.1 织入 7. JDK 动态代理实现 8. CGLIB 动态代理实现 9. 总结 1. 代理模式 代理模式&#xf…

Mac查看系统状态

syatem profiler mac系统中提供了system profiler来查看系统的详细信息&#xff0c;包括硬件、网络以及安装的软件 Console 显示了系统上的日志文件信息&#xff0c;有助于诊断问题 Activity Monitor 可以提供正在运行的系统的相关信息 https://zhhll.icu/2021/Mac/查看系统…

【云原生】一文学会Docker存储所有特性

目录 1.Volumes 1.Volumes使用场景 2.持久将资源存放 3. 只读挂载 2.Bind mount Bind mounts使用场景 3.tmpfs mounts使用场景 4.Bind mounts和Volumes行为上的差异 5.docker file将存储内置到镜像中 6.volumes管理 1.查看存储卷 2.删除存储卷 3.查看存储卷的详细信息…

Java课题笔记~Maven基础

2、Maven 基础 2.1 Maven安装与配置 下载安装 配置&#xff1a;修改安装目录/conf/settings.xml 本地仓库&#xff1a;存放的是下载的jar包 中央仓库&#xff1a;要从哪个网站去下载jar包 - 阿里云的仓库 2.2 创建Maven项目

MySQL数据库 【索引事务】

目录 一、概念 二、索引的优缺点 1、索引的优点 2、索引的缺陷 三、索引的使用 1、查看索引 2、创建索引 3、删除索引 四、索引底层的数据结构 1、B树 2、B树 五、索引事务 1、概念和回滚 2、事务的使用 3、事务的基本特性 4、并发会遇到的问题 &#xff08…

jenkins执行jmeter时,报Begin size 1 is not equal to fixed size 5

jenkins执行jmeter脚本的时候一直提示如下错误&#xff1a; Tidying up ... Fri Jul 28 17:03:53 CST 2023 (1690535033178) Error generating the report: org.apache.jmeter.report.dashboard.GenerationException: Error while processing samples: Consumer failed wi…

游游的排列构造

示例1 输入 5 2 输出 3 1 5 2 4 示例2 输入 5 3 输出 2 1 4 3 5 #include<bits/stdc.h> using namespace std; typedef long long ll; const int N1e55; int n,k; int main(){scanf("%d%d",&n,&k);int xn-k1;int yn-k;int f1;for(int i1;i&l…

产品经理如何平衡用户体验与商业价值?

近期负责前端产品设计工作的小李忍不住抱怨&#xff1a;公司总是要求客户第一&#xff0c;实现客户良好体验&#xff0c;但在实际操作过程中&#xff0c;面向用户 体验提升的需求&#xff0c;研发资源计划几乎很难排上&#xff0c;资源都放在公司根据业务价值排序的需求…

大家做性能测试都用什么工具

在进行测试时&#xff0c;选择适合的测试工具至关重要&#xff0c;因为优秀的测试工具能够显著提高工作效率。对于性能测试和自动化测试而言&#xff0c;大多数人会选择传统的JMeter等工具&#xff0c;然而这些工具存在学习成本高、使用门槛高的问题。 因此&#xff0c;我在这…

intellij 编辑器内性能提示

介绍 IntelliJ IDEA已经出了最新版的2023.2&#xff0c;最耀眼的功能无法两个 AI Assistant编辑器内性能提示 AI Assistant 已经尝试过了是限定功能&#xff0c;因为是基于open ai,所以限定的意思是国内无法使用&#xff0c;今天我们主要介绍是编辑器内性能提示 IntelliJ Pr…

Flink回撤流

1.回撤流定义&#xff08;RetractStream&#xff09; Flink 的回撤流是指在 Flink 的流处理算法中&#xff0c;撤回已经发送到下游节点的数据。这是因为在实际应用场景中&#xff0c;有些错误数据可能会发送到下游节点&#xff0c;因此需要回撤流以保证数据的准确性。 回撤流…

EP4CE6E22C8N Error: Can‘t recognize silicon ID for device 1

经过各种排查&#xff0c;发现是AS配置不对&#xff0c;仅供参考 工程 参考某处的工程画板配置的FPGA板子&#xff0c;用于学习入门FPGA。 烧录sof文件是正常的&#xff0c;并能正常运行。 但是烧录jic是failed&#xff0c;查看报错为&#xff1a;Error: Can’t recognize si…

渗透测试:Linux提权精讲(二)之sudo方法第二期

目录 写在开头 sudo expect sudo fail2ban sudo find sudo flock sudo ftp sudo gcc sudo gdb sudo git sudo gzip/gunzip sudo iftop sudo hping3 sudo java 总结与思考 写在开头 本文在上一篇博客的基础上继续讲解渗透测试的sudo提权方法。相关内容的介绍与背…

1004. 最大连续1的个数 III

题目描述&#xff1a; 主要思路&#xff1a; 刚看到这个问题首先想到的是二分答案&#xff0c;二分长度&#xff0c;然后利用滑动窗口判断是否可以达成。 class Solution { public:bool find(int x,vector<int> nums, int k){int now0;for(int i0,j0;i<nums.size();…

根据端口号查找服务位置

已知服务的IP和端口&#xff0c;查找该服务所在位置 1、打开命令提示符&#xff08;CMD&#xff09; WINR快捷键打开运行对话框&#xff0c;输入CMD&#xff0c;打开命令行。 2、找到对应的PID或程序名称 输入netstat -ano|findstr 端口号&#xff0c;找到对应的PID&#…

解决:h5的<video>在移动端浏览器无法自动播放

并不是所有的移动端浏览器都无法自动播放&#xff0c;下载谷歌、火狐、edge等都可以正常播放&#xff0c;目前发现夸克浏览器无法自动播放。即autoplay属性失效。 <video autoplay"autoplay"></video> 可能移动端有移动端的策略&#xff0c;但解决夸克…

企业数字化转型失败率达80%,面临哪些挑战?应该如何规划?

随着数字化在社会的飞速发展&#xff0c;人们的生活工作娱乐等方方面面都已经被数字化占领&#xff0c;数字化所衍生出的数字经济更是成为高速增长的国民经济支柱&#xff0c;而数据作为“副产品”也成功进化为第五大生产要素&#xff0c;发挥出巨大的价值&#xff0c;变成了个…