flask-wtf使用
Web应用程序的一个重要方面是为用户提供一个用户界面。HTML提供了一个
标签,用于设计一个接口。一个Form 元素,例如文本输入,单选框等可以适当地使用。
通过GET或POST方法将用户输入的数据以Http请求消息的形式提交给服务器端脚本。
服务器端脚本必须从http请求数据重新创建表单元素。所以实际上,表单元素必须被定义两次 - 一次是HTML,一次是服务器端脚本。
使用HTML表单的另一个缺点是很难(如果不是不可能)动态地呈现表单元素。HTML本身无法验证用户的输入。
这就是 WTForms ,一个灵活的表单,渲染和验证库来得方便的地方。Flask-WTF扩展为这个 WTForms 库提供了一个简单的接口。
使用 Flask-WTF ,我们可以在我们的Python脚本中定义表单域并使用HTML模板来呈现它们。也可以将验证应用于 WTF 字段。
让我们看看这个动态生成的HTML如何工作。
首先,需要安装Flask-WTF扩展。
- pip install flask-WTF
已安装的软件包包含一个 Form 类,该类必须用作用户定义表单的父级。
WTforms 包包含各种表单域的定义。下面列出了一些 标准表单字段 。
序号 | 标准表格字段和说明 |
---|---|
1 | TextField 代表<input type ='text'> HTML表单元素 |
2 | BooleanField 代表<input type ='checkbox'> HTML表单元素 |
3 | DecimalField 用小数显示数字的文本字段 |
4 | IntegerField 用于显示整数的TextField |
5 | RadioField 代表<input type ='radio'> HTML表单元素 |
6 | SelectField 表示选择表单元素 |
7 | TextAreaField 代表<testarea> html表单元素 |
8 | PasswordField 代表<input type ='password'> HTML表单元素 |
9 | SubmitField 表示<input type ='submit'>表单元素 |
例如,可以设计一个包含文本字段的表单,如下所示 -
- from flask_wtf import Form
- from wtforms import TextField
- class ContactForm(Form):
- name = TextField("Name Of Student")
除了 'name' 字段之外,还会自动创建一个CSRF令牌的隐藏字段。这是为了防止 跨站请求伪造 攻击。
渲染时,这将产生一个等效的HTML脚本,如下所示。
- <input id = "csrf_token" name = "csrf_token" type = "hidden" />
- <label for = "name">Name Of Student</label><br>
- <input id = "name" name = "name" type = "text" value = "" />
用户定义的表单类在Flask应用程序中使用,表单使用模板呈现。
- from flask import Flask, render_template
- from forms import ContactForm
- app = Flask(__name__)
- app.secret_key = 'development key'
- @app.route('/contact')
- def contact():
- form = ContactForm()
- return render_template('contact.html', form = form)
- if __name__ == '__main__':
- app.run(debug = True)
WTForms包也包含验证器类。在验证表单域时非常有用。以下列表显示了常用的验证器。
Sr.No | 验证器类和描述 |
---|---|
1 | DataRequired 检查输入栏是否为空 |
2 | Email 检查字段中的文本是否遵循电子邮件ID约定 |
3 | IPAddress 验证输入字段中的IP地址 |
4 | Length 验证输入字段中字符串的长度是否在给定范围内 |
5 | NumberRange 在给定范围内的输入字段中验证一个数字 |
6 | URL 验证输入字段中输入的URL |
现在我们将以联系表格的形式为 名称 字段应用 'DataRequired' 验证规则。 **
- name = TextField("Name Of Student",[validators.Required("Please enter your name.")])
表单对象的 validate() 函数验证表单数据,并在验证失败时抛出验证错误。该 错误 消息被发送到模板。在HTML模板中,错误消息是动态呈现的。
- {% for message in form.name.errors %}
- {{ message }}
- {% endfor %}
以下示例演示了上面给出的概念。 Contact form 的设计如下 (forms.py) 。
- from flask_wtf import Form
- from wtforms import TextField, IntegerField, TextAreaField, SubmitField, RadioField,
- SelectField
- from wtforms import validators, ValidationError
- class ContactForm(Form):
- name = TextField("Name Of Student",[validators.Required("Please enter
- your name.")])
- Gender = RadioField('Gender', choices = [('M','Male'),('F','Female')])
- Address = TextAreaField("Address")
- email = TextField("Email",[validators.Required("Please enter your email address."),
- validators.Email("Please enter your email address.")])
- Age = IntegerField("age")
- language = SelectField('Languages', choices = [('cpp', 'C++'),
- ('py', 'Python')])
- submit = SubmitField("Send")
验证器应用于 名称 和 电子邮件 字段。
下面给出的是Flask应用程序脚本 (formexample.py) 。
- from flask import Flask, render_template, request, flash
- from forms import ContactForm
- app = Flask(__name__)
- app.secret_key = 'development key'
- @app.route('/contact', methods = ['GET', 'POST'])
- def contact():
- form = ContactForm()
- if request.method == 'POST':
- if form.validate() == False:
- flash('All fields are required.')
- return render_template('contact.html', form = form)
- else:
- return render_template('success.html')
- elif request.method == 'GET':
- return render_template('contact.html', form = form)
- if __name__ == '__main__':
- app.run(debug = True)
模板的脚本 (contact.html) 如下所示 -
- <!doctype html>
- <html>
- <body>
- <h2 style = "text-align: center;">Contact Form</h2>
- {% for message in form.name.errors %}
- <div>{{ message }}</div>
- {% endfor %}
- {% for message in form.email.errors %}
- <div>{{ message }}</div>
- {% endfor %}
- <form action = "http://localhost:5000/contact" method = post>
- <fieldset>
- <legend>Contact Form</legend>
- {{ form.hidden_tag() }}
- <div style = font-size:20px; font-weight:bold; margin-left:150px;>
- {{ form.name.label }}<br>
- {{ form.name }}
- <br>
- {{ form.Gender.label }} {{ form.Gender }}
- {{ form.Address.label }}<br>
- {{ form.Address }}
- <br>
- {{ form.email.label }}<br>
- {{ form.email }}
- <br>
- {{ form.Age.label }}<br>
- {{ form.Age }}
- <br>
- {{ form.language.label }}<br>
- {{ form.language }}
- <br>
- {{ form.submit }}
- </div>
- </fieldset>
- </form>
- </body>
- </html>
flask-wtf使用的更多相关文章
- Flask - WTF和WTForms创建表单
目录 Flask - WTF和WTForms创建表单 一. Flask-WTF 1.创建基础表单 2.CSRF保护 3.验证表单 4.文件上传 5.验证码 二. WTForms 1. field字段 ...
- 【Flask】 结合wtforms的文件上传表单
表单中的文件上传 基本的表单渲染,表单类设置等等就不多说了,参看另一个文章即可.但是那篇文章里没有提到对于FileField,也就是上传文件的表单字段是如何处理,后端又是如何实现接受上传过来的文件的. ...
- Flask 入门(第一篇)
1. 认识 Flask Flask 是一个微型 Web 框架,依赖于 jinjia2 模板系统和 Werkzeug WSGI(本质为 Socket 服务端) 服务,默认情况不支持数据库抽象层.表单验证 ...
- 用 Flask 来写个轻博客 (13) — M(V)C_WTForms 服务端表单检验
目录 目录 前文列表 WTForms WTF 的基础使用 常用的字段类型 fieldsDateField fieldsIntegerField fieldsFloatField fieldsStrin ...
- flask修改flask_wtf使其支持json数据的validation验证
flask默认是前后端不分离策略,前端通过flask+wtf表单来传递post,put...等数据. 现在前后端分离是趋势,那么对flask进行一定的修改,变为前后端分离,在前端页面中请求后端,那么请 ...
- Flask Jinja2 知识点
Jinja2模板引擎使用以下分隔符从HTML转义. {% ... %}用于语句 {{ ... }}用于表达式可以打印到模板输出 {# ... #}用于未包含在模板输出中的注释 # ... ##用于行语 ...
- python flask框架详解
Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务.本文参考自Flask官方文档, 英文不好的同学也可以参考中文文档 1.安装flask pi ...
- 不管你是否已经准备面试, 这45道Python面试题都对你非常有帮助!(mark!)
1)什么是Python?使用Python有什么好处? Python是一种编程语言,包含对象,模块,线程,异常和自动内存管理.蟒蛇的好处在于它简单易用,可移植,可扩展,内置数据结构,并且它是一个开源的. ...
- Python面试应急5分钟!
不论你是初入江湖,还是江湖老手,只要你想给自己一个定位那就少不了面试!面试的重要性相信大家都知道把,这就是我们常说的“第一印象”,给大家说一下我的面试心得把,面试前的紧张是要的,因为这能让你充分准 ...
- python 全栈之路
目录 Python 全栈之路 一. Python 1. Python基础知识部分 2. Python -函数 3. Python - 模块 4. Python - 面对对象 5. Python - 文 ...
随机推荐
- Date 对象 定时器
日期对象 Date 概述:date是表示日期时间的对象,主要的方法是获取时间和设置日期时间. date声明 使用new Date声明 有4种方式 1.不设参数 是获取当前的本地时间 var date ...
- LOJ数列分块入门九题(中)
#6281. 数列分块入门 5 - 题目 - LibreOJ (loj.ac) 区间开方,区间求和题. 显然,针对区间维护开方操作很难做到,于是考虑其值的性质,显然,int范围内的值最多开方6次就会变 ...
- git commit --amend适用场景详解
适用场景: 场景1.本地开发代码已提交,提交后发现这次提交的代码有问题,或者漏提交了一些文件,此时,希望达到以下目的: ①修改有问题的代码. ②补足漏提交的文件(一般是新增的文件没有git add . ...
- springboot配置类@ConfigurationProperties报错Not registered via @EnableConfigurationProperties or marked as Spring component
添加一个@Component可以解决此问题,只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能.
- BubbleSort,冒泡排序,C++非递归和递归实现
1 // g++ bubble_sort.cc -Wall -O3 && ./a.exe 2 3 4 #include <iostream> 5 #include < ...
- 安装 TensorFlow 参考过的资料
anaconda 的新环境创建 https://blog.csdn.net/yandajiangjun/article/details/102615912
- windows环境下本地项目(或gitlab上拉取项目)在Jenkins上自动打包部署 超超超详细!!!!!
一.环境准备 1.下载jdk,官网:http://www.oracle.com/ 2.下载Jenkins,官网:https://www.jenkins.io/ 3.下载Tomcat,官网:http:/ ...
- promise一脸懵逼...
// 要求:封装一个方法,能根据路径读取文件,并把内容返回 const fs=require('fs') const path=require('path') 1. 普通读取文件的方式 1 const ...
- k8s configmap 配置分离
ConfigMap ConfigMap用于保存配置珊数据的键值对,可以用来保存单个属性,也可以用来保存配置文件.一张图解释 上图就是整个ConfigMap的生命周期以及使用方式, ConfigMap的 ...
- java的死锁与解决方法
一.什么是死锁? 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无限等待. 二.产生死锁的原因与四个条件 2.1 死锁原因 竞争资 ...