Flask——使用表单并检验参数

2023-11-02

回顾上期的程序代码:

from flask import Flask,render_template
from flask_wtf import FlaskForm
from wtforms import StringField,PasswordField,SubmitField
from wtforms.validators import DataRequired,EqualTo

app = Flask(__name__)

# 配置参数SECRET_KEY
app.config["SECRET_KEY"] = "ASDHJAVDHJASDVASYJDV"

# 定义表单的模型类
class RegisterFrom(FlaskForm):
    """自定义的注册表单模型类"""
    # StringField,PasswordField的参数分别是 模块名字,对应验证器
    # DataRequired 保证数据必须填写,并且不能为空
    user_name = StringField(label = u"用户名",validators=[DataRequired(u"用户名不能为空")])
    user_password = PasswordField(label=u"密码",validators=[DataRequired(u"密码不能为空")])
    same_password = PasswordField(label=u"确认密码", validators=[DataRequired(u"密码不能为空"),EqualTo("user_password",u"两次密码不一致")])

    submit = SubmitField(label="提交")

@app.route("/register")
def index():
    form = RegisterFrom()
    return render_template("register.html",form = form)

if __name__ == '__main__':
    app.run(debug = True,port=8000)

这里的“提交”按钮点击后的数据会返回register函数中,此时可以对返回的数据进行处理,如以下程序进行操作:

from flask import Flask, render_template, redirect, session, url_for
from flask_wtf import FlaskForm
from wtforms import StringField,PasswordField,SubmitField
from wtforms.validators import DataRequired,EqualTo

app = Flask(__name__)

# 配置参数SECRET_KEY
app.config["SECRET_KEY"] = "ASDHJAVDHJASDVASYJDV"

# 定义表单的模型类
class RegisterFrom(FlaskForm):
    """自定义的注册表单模型类"""
    # StringField,PasswordField的参数分别是 模块名字,对应验证器
    # DataRequired 保证数据必须填写,并且不能为空
    user_name = StringField(label = u"用户名",validators=[DataRequired(u"用户名不能为空")])
    user_password = PasswordField(label=u"密码",validators=[DataRequired(u"密码不能为空")])
    same_password = PasswordField(label=u"确认密码", validators=[DataRequired(u"密码不能为空"),EqualTo("user_password",u"两次密码不一致")])

    submit = SubmitField(label="提交")

@app.route("/register", methods=["GET", "POST"])
def register():
    # 创建表单对象,如果时post请求,前端发送了数据,flask会把数据在构造form对象的时候,存放到对象中
    form = RegisterFrom()
    # 判断form中的数据是否合理,如果返回的数据不合理(即通过不了表单的验证器)就不会执行以下代码
    if form.validate_on_submit():
        name = form.user_name.data
        password = form.user_password.data
        again_password = form.same_password.data
        print(name, password, again_password)
        session["user_name"] = name
        # 跳转到新建的视窗中
        return redirect(url_for("index"))
    return render_template("register.html",form = form)

# 新建视窗函数,验证结果是否有误
@app.route("/index")
def index():
    result = session.get("user_name", " ")
    return "hello %s \n welcome to my world"%result

if __name__ == '__main__':
    app.run(debug = True,port=8000)

对应的html文件为:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form method="post">
        {{ form.user_name.label }}
        <p>{{form.user_name}}</p>
        {% for msg in form.user_name.errors %}
        <p>{{msg}}</p>
        {% endfor %}

        {{ form.user_password.label }}
        <p>{{form.user_password}}</p>
        {% for msg in form.user_password.errors %}
        <p>{{msg}}</p>
        {% endfor %}

        {{ form.same_password.label }}
        <p>{{form.same_password}}</p>
        {% for msg in form.same_password.errors %}
        <p>{{msg}}</p>
        {% endfor %}

        {{form.submit}}
    </form>
</body>
</html>

启动程序后打开浏览器界面为:
在这里插入图片描述
当两个密码输入不一致返回的场景为:
在这里插入图片描述
当两个密码输入一致返回的场景为:
在这里插入图片描述
这里看到当输入参数正确的情况下,没有跳转到新建的视窗中,因为我们只设置cookies里CSRF,但在表单中并没有设置,因此要在表单中设置好CSRF,修改对应的html文件为:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form method="post">
        {{ form.csrf_token }}

        {{ form.user_name.label }}
        <p>{{form.user_name}}</p>
        {% for msg in form.user_name.errors %}
        <p>{{msg}}</p>
        {% endfor %}

        {{ form.user_password.label }}
        <p>{{form.user_password}}</p>
        {% for msg in form.user_password.errors %}
        <p>{{msg}}</p>
        {% endfor %}

        {{ form.same_password.label }}
        <p>{{form.same_password}}</p>
        {% for msg in form.same_password.errors %}
        <p>{{msg}}</p>
        {% endfor %}

        {{form.submit}}
    </form>
</body>
</html>

重新启动程序打开浏览器界面(这是确保输出的参数满足要求,即两次输入的密码一致):
在这里插入图片描述
点击“提交”按钮,跳转到新建的视窗中:
在这里插入图片描述
上述是一个容易忽略的要点,因此单独拿出来进行说明,以上就是flask使用表单并检验参数的基本方法,有疑问的欢迎评论或私信博主啊。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flask——使用表单并检验参数 的相关文章

随机推荐

  • xshell通过跳板机使用隧道和代理连接服务器

    1 建立和跳板机的连接 主机和端口为跳板机的ip和端口 2 使用publicKey认证 3 通过隧道建立和目标主机的连接 源主机为localhost 侦听端口任意填不和本地端口冲突即可 目标主机和端口为要访问的主机端口 4 使用代理 加快本
  • [完美解决]当前不会命中断点。还没有为该文档加载任何符号。

    原文地址 http www cnblogs com furenjun archive 2011 05 31 2064287 html 概述 在调试SL项目 我重装了电脑 项目也是重新配置的 后来在调试的时候发现断点进不去 折腾了两个小时 将
  • vue自定义指令v-loading

    elementUI或者antdesign上的loading拿来就用简单无脑 以前我也是一直在用UI框架自带的loading 后来用的发现好呆板 一点也不炫酷 于是就自定义了 废话不说了直接看效果图 1 创建文件 1 在 src目录下创建一个
  • 学习笔记:区块链概念入门

    本文是100天区块链学习计划的第二篇学习笔记 其实就是按照阮一峰的网络日志 区块链入门教程的讲解进行的简单梳理 也是时间有点紧张的原因 相比于上一篇SHA256算法原理详解 个人感觉质量和原创程度明显下降 待对区块链有了更深的理解后 我会回
  • 【cuda大师班】p12 主机和设备之间的数据传递

    一 主机和设备之间的数据传递 1 1 基本流程框图 1 2 数据传递函数 在主机和设备之间必须显式的传递数据 1 3 代码 使用h 表示某个变量是主机变量 使用d 表示某个变量是主机变量 include cuda runtime h inc
  • ugui实现listview效果

    我们今天要实现listview的效果 首先看下ui结构 根节点是画布 Store节点只是为了固定锚点 抛开背景和标题 核心部分只有ScrollRect ViewPoint Slots Scrollbar ScrollRect是滑动布局 co
  • C++ Programming/RTTI

    原文地址 http en wikibooks org wiki C 2B 2B Programming RTTI Run Time Type Information RTTI RTTI refers to the ability of th
  • Flutter原理与美团的实践

    Flutter是Google开发的一套全新的跨平台 开源UI框架 支持iOS Android系统开发 并且是未来新操作系统Fuchsia的默认开发套件 自从2017年5月发布第一个版本以来 目前Flutter已经发布了近60个版本 并且在2
  • Python- 关于重复字段的一些统计

    问题场景 1 统计dataframe中某两个 多个 字段作为一个整体在dataframe中重复的次数 gt 得到 gt 2 获取某一字段重复次数最多的索引 PS 上图中count最大值为3 索引index 为0 3 获取某一字段重复次数最多
  • Java软件开发

    在开发中我们使用比较多的集合就是List Set和Map了 并且我们也知道大部分用的基本上都是ArrayList LinkedList HashMap HashSet或者TreeSet这几个集合 但是我们在学习使用它们的时候都知道它们这几个
  • upload-labs:pass-07

    is upload false msg null if isset POST submit if file exists UPLOAD PATH deny ext array php php5 php4 php3 php2 html htm
  • 实验九、内核虚拟化

    1 搭建openEuler x86 64系统的qemu虚拟机 1 1 安装虚拟化组件 dnf install y libvirt qemu 1 2验证是否安装成功 安装成功 1 3查看libvird是否已启动 启动成功 1 4查看虚拟网络配
  • QT笔记——QTableWidget点击表头排序问题 数据消失

    在QTableWidget 点击表头排序后 发现重新加载进来的数据消失或者很多空白 解决方法 排序方法 void DesignProductWidget DesignProductWidget ui tableWidget gt setSo
  • mysql安装—基于deepin

    文章目录 MySQL安装 基于deepin20 2 一 安装包准备 二 安装mysql 三 安装完成 MySQL安装 基于deepin20 2 今天带来一期关于如何在Deepin上安装MySQL 总体来说是比较简单的 一 安装包准备 火狐浏
  • opencv中更改摄像头参数,更改mpjg和帧率遇到的问题

    import numpy as np import cv2 import time cv2 VideoCapture set cv2 CAP PROP FPS 30 cap cv2 VideoCapture 0 cap cv2 VideoC
  • Kubernetes(K8s) 安装(使用kubeadm安装Kubernetes集群)

    目录 一 Centos7 配置说明 1 1 Firewalld 防火墙 1 2 SELinux 二 安装准备工作 2 1 安装环境 2 2 部署环境说明 2 3 配置主机名 master和node节点都执行 2 3 1 修改主机名 2 3
  • redis master和slave怎么实现数据同步

    转载于 https blog csdn net hxpjava1 article details 78347890 Redis的主从同步机制可以确保redis的master和slave之间的数据同步 按照同步内容的多少可以分为全同步和部分同
  • yolov5小目标检测-提高检测小目标的检测精度

    目前基于目标检测方面 近些年基于深度学习的人神经网络产生了很多经典且高效的网络结构 其中不乏有凯明大神的Fast RCNN Faster RCNN家族系列检测网络结构 还有号称you only look once的YOLO系列 本次分享的就
  • 服务器的可维护性,可靠性和可维护性

    可靠性和可维护性 可靠性一直是戴尔服务器产品线的一大亮点 R515也不例外 如内部结构所示 当你打开R515机箱的时候 你可以很明显地看到风扇的数量 分布的各个组件和双电源机箱 你也可以感觉出从中取出各个组件和拆装机箱都十分简便 配合低能耗
  • Flask——使用表单并检验参数

    回顾上期的程序代码 from flask import Flask render template from flask wtf import FlaskForm from wtforms import StringField Passwo