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 - 文 ...
随机推荐
- 小梅哥课程学习——LED花式玩法(从计数器器到线性序列机)——实验六
//每隔10ms,让led灯的一个8状态循环执行一次(每个变化时间值小一点,方便测试比如设置为10us) 源代码 module counter_led_6( clk, reset_n, ...
- C++ vector的emplace_back函数
C++ STL的vector相信大家一定都知道,它是一个一般用来当做可变长度列表的类.在C++11之前,一般给vector插入新元素用得都是push_back函数,比如下面这样: std::vecto ...
- Matlab字体设置中找不到字体的解决方法(转载)
Matlab字体设置中找不到字体 Matlab默认的字体实在不好看,一般都需要重新设置字体. 在其字体设置中有些字体不能同时支持中文和英文,我在之前的博客中说过,如何为Matlab设置一款好看的同时兼 ...
- 2020.4.28关于pta的总结
0.前言 这次作业针对的是oo程序设计第二单元(5-8周)的作业,在整体当中属于第4到第6次作业. 此三次作业的知识要点为:继承类,多态性,字符串,结构类,接口类. 此三次作业的时间为20.4.12- ...
- Java VSCode 基础教学
VSCode 超全设置1.下载2.插件安装3.项目创建4.设置5.快捷键6.优化7.导出 Jar 包 VSCode 超全设置 VSCode(Visual Studio Code) 是一款 Micros ...
- Oracle 取Group By 第一条
select *from (select emp.*,row_number() over(partition by deptno order by rownum) cn from emp)where ...
- 安卓自动化查看包名和activity名的方法
1,cmd下,adb shell "dumpsys window | grep mCurrentFocus" 2,CMD中输入adb logcat ActivityManager: ...
- 【Python】Python3环境安装
编译安装 安装依赖 yum install wget gcc make zlib-devel openssl openssl-devel readline-devel wget "https ...
- 去除Bigdecimal末尾的.00
String total = new BigDecimal("100.00").stripTrailingZeros().toPlainString();
- python list dict util (分割,分组)
1.list数据分割为多个小列表 (java lists.partition) 2. 分组 import itertools def partition(mylist, size): " ...