百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Python Flask Web表单

myzbx 2025-03-05 19:30 28 浏览

学习照猫画虎,是一种享受,实际上学习的痛苦是短暂的,没去学的痛苦是长期的。以后会有很多瞬间,因为你自己不会,而错失了良机~


1、配置

Flask-WTF 可以把处理Web表单的过程变成一种愉快的体验,首先是安装~

ailx10

10w+ 次咨询

网络安全优秀回答者

网络安全硕士

去咨询

然后是配置一个应用密钥,越复杂越好,这是为了防止CSRF跨站脚本伪造,Flask-WTF为所有表单生成安全令牌,存储在用户会话中~

2、表单类

每个表单都由一个继承 FlaskForm 的类表示,这个类定义表单中的一组字段,每个字段都是一个对象,字段对象可以附属多个验证函数,用于验证用户提交的数据是否有效~

  • NameForm 是一个大表单
  • name 是StringField类对象,表示type="text"的元素
  • submit 是SubmitField类对象,表示type="submit"的元素
  • 对象的第一个参数会渲染成 label

字段类型

说明

BooleanField

复选框,值为True或False

DateField

文本字段,值为datetime.date格式

DateTimeField

文本字段,值为datetime.datetime格式

DecimalField

文本字段,值为decimal.Decimal

FileField

文件上传字段

HiddenField

隐藏的文本字段

MultipleFileField

多文件创段字段

FieldList

一组指定类型的字段

FloatField

文本字段,值为浮点型

FormField

把一个表单作为字段,嵌入另一个表单

IntegerField

文本字段,值为整数

PasswordField

密码文本字段

RadioField

一组单选按钮

SelectField

下拉列表

SelectMultipleField

下拉列表,值可以多选

SubmitField

表单提交按钮

StringField

文本字段

TextAreaField

多行文本字段

常见的wtf 表单验证函数

验证函数

说明

DataRequired

确保转换类型后字段中有数据

Email

验证电子邮件

EqualTo

比较两个字段的值

InputRequired

确保转换类型前字段中有数据

IPAddress

验证IPv4网络地址

Length

验证输入字符串的长度

MacAddress

验证MAC地址

NumberRange

验证输入的值在数字范围之内

Optional

允许字段中没有输入

Regexp

使用正则表达式验证输入值

URL

验证URL

UUID

验证UUID

AnyOf

验证输入值在一组可能的值中

NoneOf

确保输入值不在一组可能的值中

3、把表单渲染成HTML

可以使用Bootstrap预定义的表单样式渲染整个Flask-WTF表单,只需要2句话就可以了,wtf.quick_form() 函数的参数是Flask-WTF表单对象,使用Bootstrap的默认样式渲染传入的表单~

{% import "bootstrap/wtf.html" as wtf %}
{{ wtf.quick_form(form) }}

4、在视图中处理表单

  • 直接请求,没有提交表单,是GET请求
  • 提交表单,就是POST请求
  • form参数和name参数,都会进入index.html进行渲染
@app.route("/",methods=["GET","POST"])
def index():
    name = None
    form = NameForm()
    if form.validate_on_submit():
        name = form.name.data
        form.name.data = ""
    return render_template("index.html",form=form,name=name)

输入ailx10,然后提交表单,渲染效果如下:

5、重定向和用户会话

当我们刷新页面的时候,页面会弹出来一个对话框,这是因为我们是POST提交的表单,页面刷新会再次提交表单,但是这并不是我们期望的~

于是就有了重定向了,我们最好让Web应用以GET方式结尾,这样怎么刷新都没问题~

  • redirect(url_for("index")) 重定向到一个新的URL
  • name=session.get("name") 如果没有GET到内容,返回None
@app.route("/",methods=["GET","POST"])
def index():
    form = NameForm()
    if form.validate_on_submit():
        session["name"] = form.name.data
        return redirect(url_for("index"))
    return render_template("index.html",form=form,name=session.get("name"))

6、闪现消息

请求完成后,有时需要让用户感知状态发送了变化,Flask内置了这个功能~

flash函数可以实现这个效果,如果你第一次和第二次输入的名字不一样,那么会出现一个提醒:“你改名字啦~“

{% block content %}
{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %} {% block page_content %}{% endblock %}
{% endblock %}
@app.route("/",methods=["GET","POST"])
def index():
    form = NameForm()
    if form.validate_on_submit():
        old_name = session.get("name")
        if old_name is not None and old_name != form.name.data:
            flash("你改名字啦~")
        session["name"] = form.name.data
        return redirect(url_for("index"))
    return render_template("index.html",form=form,name=session.get("name"))

本篇完,谢谢大家~

发布于 2021-01-12 23:08 (知乎)

相关推荐

C语言速成之数组:C语言数据处理的核心武器,你真的玩透了吗?

程序员Feri一名12年+的程序员,做过开发带过团队创过业,擅长Java、鸿蒙、嵌入式、人工智能等开发,专注于程序员成长的那点儿事,希望在成长的路上有你相伴!君志所向,一往无前!数组:C语言数据处理...

ES6史上最全数JS数组方法合集-02-数组操作

数组生成array.ofletres=Array.of(1,2,3)console.log(res)//[1,2,3]下标定位indexOf用于查找数组中是否存在某个值,如果存...

前端性能拉胯?这 8 个 JavaScript 技巧让你的代码飞起来!

在前端开发的江湖里,JavaScript就是我们手中的“绝世宝剑”。但为啥别人用剑就能轻松斩敌,你的代码却总拖后腿,页面加载慢、交互卡顿?别着急!今天带来8个超实用的JavaScript实...

12种JavaScript中最常用的数组操作整理汇总

数组是最常见的数据结构之一,我们需要绝对自信地使用它。在这里,我将列出JavaScript中最重要的几个数组常用操作片段,包括数组长度、替换元素、去重以及许多其他内容。1、数组长度大多数人都知道可...

手把手教你在Webpack写一个Loader

前言有的时候,你可能在从零搭建Webpack项目很熟悉,配置过各种loader,面试官在Webpack方面问你,是否自己实现过一个loader?如果没有去了解过如果去实现,确实有点尴尬,其...

const关键字到底该什么用?(可以用const关键字定义变量吗)

文|守望先生经授权转载自公众号编程珠玑(id:shouwangxiansheng)前言我们都知道使用const关键字限定一个变量为只读,但它是真正意义上的只读吗?实际中又该如何使用const关键字...

“JavaScript变量声明三兄弟,你真的会用吗?

在JavaScript中,var、let和const是声明变量的关键字,它们在作用域、变量提升、重复声明和重新赋值等方面有显著区别。以下是它们的相同点和不同点,并通过代码示例详细说明。一、相同点声明变...

ES6(二)let 和 const(es6 var let const区别)

let命令let和var差不多,只是限制了有效范围。先定义后使用不管是什么编程语言,不管语法是否允许,都要秉承先定义,然后再使用的习惯,这样不会出幺蛾子。以前JavaScript比较随意,...

js 里面 let 和 const的区别(js中的let)

在JavaScript(包括Vue、Node.js、前端脚本等)中,const和let是用于声明变量的两种方式,它们的主要区别如下:constvslet的区别特性constlet是否...

JDK21新特性:Sequenced Collections

SequencedCollectionsJDK21在JEP431提出了有序集合(SequencedCollections)。引入新的接口来表示有序集合。这样的集合都有一个明确的第一个元素、第二个...

动态编程基础——第 2 部分(动态编程是什么)

有两种方法可以使用动态规划来解决问题。在这篇文章中,我们将了解制表法。请参阅我的动态编程基础——第1部分了解记忆方法。记忆制表什么是动态规划?它是一种简单递归的优化技术。它大大减少了解决给定...

Lambda 函数,你真的的了解吗(lambda函数用法)

什么是lambda函数lambda函数是一个匿名函数,这意味着与其他函数不同,它们没有名称。这是一个函数,它添加两个数字,写成一个命名函数,可以按其名称调用它们:defadd(x,y):...

JavaScript 数组操作方法大全(js数组操作的常用方法有哪些)

数组操作是JavaScript中非常重要也非常常用的技巧。本文整理了常用的数组操作方法(包括ES6的map、forEach、every、some、filter、find、from、of等)...

系列专栏(六):解构赋值(解构赋值默认值)

ES6作为新一代JavaScript标准,已正式与广大前端开发者见面。为了让大家对ES6的诸多新特性有更深入的了解,MozillaWeb开发者博客推出了《ES6InDepth》系列文章。CSDN...

js列表遍历方法解读(js遍历链表)

JavaScript提供了多种遍历数组(或列表)的方法。以下是一些常用的方法及其解读:for循环:vararray=[1,2,3,4,5];for(vari=0;...