python表单处理_python flask 表单处理Flask-WTF

涉及到的插件和包有Flask-WTF,WTForms。内容有表单的创建使用流程,一些最佳实践,还有在页面显示提示消息的简单方式,配合Flask内置的 flash()。

Flask的requset对象包含了client端发送过来的所有请求,在request.form中就有POST方法提交过来的表单数据。直接使用这些数据可以搞定表单的操作,不过不方便,于是有了Flask-WTF这个插件,它将WTForms这个包嵌入Flask里,简化Flask下的使用。pip安装会把插件的以来也安装进来:

pip install flask-wtf

1

pipinstallflask-wtf

WTForms应该也同时被安装了。

跨站请求伪造(Cross-Site Request Forgery,CSRF) 保护

CSRF的原理不具体讲了,很简单,感兴趣直接网上搜即可。

Flask-WTF默认提供对CSRF的保护。应用里需要设置一个加密用的key,Flask-WTF利用这个key生成一个加密的记号来验证request带过来的表单数据。看看实例:

app = Flask(__name__)

app.config['SECRET_KEY'] = 'www.ttlsa.com'

1

2

app=Flask(__name__)

app.config['SECRET_KEY']='www.ttlsa.com'

app.config 是应用保存配置的一个字典。可以直接在字典里增加配置。SECRET_KEY这个配置变量被Flask和一些第三方插件使用,对不同的应用配置不同的值增加点可靠性。

另外,这个值最好放到环境变量里,直接写到代码里不太好。

表单类

使用Flask-WTF的时候,每一个表单都是类的形式,这个类需要继承自Form。这个类里定义一些代表表单各类域的对象,每个对象可以有多个验证器(validators)。验证器可以确保用户的输入是有效的。

原例子:

from flask.ext.wtf import Form

from wtforms import StringField, SubmitField

from wtforms.validators import Required

class NameForm(Form):

name = StringField('What is your name?', validators=[Required()])

submit = SubmitField('Submit')

1

2

3

4

5

6

7

fromflask.ext.wtfimportForm

fromwtformsimportStringField,SubmitField

fromwtforms.validatorsimportRequired

classNameForm(Form):

name=StringField('What is your name?',validators=[Required()])

submit=SubmitField('Submit')

表单中的域在类中都定义成类变量。上例中,NameForm类里有文本域name和提交按钮submit两个。StringField代表有type="text"属性的元素。SubmitField代表有type="submit"属性的元素。构造器的第一个参数是后续渲染表单时候用到的标签(label)。

下例是一个带有文本域和提交按钮的表单例子:

from flask_wtf import Form

from wtforms import StringField, BooleanField, PasswordField,SubmitField

from wtforms.validators import DataRequired

class LoginForm(Form):

openid = StringField('openid', validators=[DataRequired()])

remember_me = BooleanField('remember_me', default = False)

password = PasswordField('password',validators=[DataRequired()])

submit = SubmitField('submit')

1

2

3

4

5

6

7

8

9

fromflask_wtfimportForm

fromwtformsimportStringField,BooleanField,PasswordField,SubmitField

fromwtforms.validatorsimportDataRequired

classLoginForm(Form):

openid=StringField('openid',validators=[DataRequired()])

remember_me=BooleanField('remember_me',default=False)

password=PasswordField('password',validators=[DataRequired()])

submit=SubmitField('submit')

表单中的域在类中都定义成类变量。上例中,LoginForm类里有字符串域openid,复选框remember_me, 密码域password,提交按钮submit。分别代表小面信息:

1

2

3

4

构造器的第一个参数是后续渲染表单时候用到的标签(label)。

在StringField里的validators参数定义了一些验证器,这些验证器会在用户提交数据前检查数据是否有效。Required验证器确保提交的内容不能为空。

WTForms提供的各种HTML域:

域类型 含义

StringField 文本

TextAreaField 多行文本

PasswordField 密码类文本

HiddenField 隐藏文本

DateField 接收给定格式的 datetime.datevalue 的文本

DateTimeField 接收给定格式的 datetime.datetimevalue 的文本T

IntegerField 接收整数的文本

DecimalField 接收decimal.Decimal类型值的文本

FloatField 接收浮点类型值的文本

BooleanField 选是否的复选框

RadioField 包含多个互斥选项的复选框

SelectField 下拉菜单

SelectMultipleField 可多选的下拉菜单

FileField 文件上传

SubmitField 提交

FormField 讲一个表单作为域放入另一个表单里

FieldList 一组给定类型的域

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

域类型含义

StringField文本

TextAreaField多行文本

PasswordField密码类文本

HiddenField隐藏文本

DateField接收给定格式的datetime.datevalue的文本

DateTimeField接收给定格式的datetime.datetimevalue的文本T

IntegerField接收整数的文本

DecimalField接收decimal.Decimal类型值的文本

FloatField接收浮点类型值的文本

BooleanField选是否的复选框

RadioField包含多个互斥选项的复选框

SelectField下拉菜单

SelectMultipleField可多选的下拉菜单

FileField文件上传

SubmitField提交

FormField讲一个表单作为域放入另一个表单里

FieldList一组给定类型的域

WTForms提供的各种验证器:

Validator Description

Email 邮箱格式

EqualTo 比较两个域的值,例如在要求输入两次密码的时候

IPAddress IPv4 地址

Length 按字符串的长度验证

NumberRange 输入数字需在某范围内

Optional 允许不填,不填的时候就忽略其他验证器

Required 必填

Regexp 通过一个正则表达式验证

URL URL格式

AnyOf 属于一组可能值中的一个

NoneOf 不属于一组可能值中的任何一个

1

2

3

4

5

6

7

8

9

10

11

12

ValidatorDescription

Email邮箱格式

EqualTo比较两个域的值,例如在要求输入两次密码的时候

IPAddressIPv4地址

Length按字符串的长度验证

NumberRange输入数字需在某范围内

Optional允许不填,不填的时候就忽略其他验证器

Required必填

Regexp通过一个正则表达式验证

URLURL格式

AnyOf属于一组可能值中的一个

NoneOf不属于一组可能值中的任何一个

渲染表单

表单的各类域在模板中渲染时表现为可调用的对象。假设将一个NameForm的实例name作为参数传入模板。

{{ form.name.label }} {{ form.name() }}

{{ form.submit() }}

1

2

3

4

{{form.name.label}}{{form.name()}}

{{form.submit()}}

这样渲染出来的页面不美观,可以尝试改进下,在调用里传入一些参数,这些参数都会被转化为这个域的属性。然后你可以用CSS自己搞定美化问题:

{{ form.name.label }} {{ form.name(id='my-text-field') }}

{{ form.submit() }}

1

2

3

4

{{form.name.label}}{{form.name(id='my-text-field')}}

{{form.submit()}}

上述方式显然很累,之前加入了Bootstrap的支持,Flask-Bootstrap插件其实也对Flask-WTF创建的表单有高层接口的支持,可以用Bootstrap来修饰一下。然后表单的模板就可以简单写成:

{% import "bootstrap/wtf.html" as wtf %}

{{ wtf.quick_form(form) }}

1

2

{%import"bootstrap/wtf.html"aswtf%}

{{wtf.quick_form(form)}}

从其他模板import个函数进来之前提到过,wtf.quick_form函数接受一个Flask-WTF的表单,然后用Bootstrap默认的样式渲染。

现在,首页index.html已经改为:

{% extends "base.html" %}

{% import "bootstrap/wtf.html" as wtf %}

{% block title %}Flasky{% endblock %}

{% block page_content %}

{{ wtf.quick_form(form) }}

{% endblock %}

1

2

3

4

5

6

7

8

9

{%extends"base.html"%}

{%import"bootstrap/wtf.html"aswtf%}

{%blocktitle%}Flasky{%endblock%}

{%blockpage_content%}

Hello,{%ifname%}{{name}}{%else%}Stranger{%endif%}!

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

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

相关文章

电脑环境变量设置 java_如何设置自己电脑的系统环境变量?

Windows下JAVA用到的环境变量主要有3个,JAVA_HOME、CLASSPATH、PATH。下面逐个分析。JAVA_HOME指向的是JDK的安装路径,如x:\JDK_1。4。2,在这路径下你应该能够找到bin、lib等目录。值得一提的是,JDK 的安装路径可以选择任意磁盘目…

用python实现打开虚拟机_如何使用python从虚拟机读取文件

我使用oraclevirtualbox在我的系统上运行一个虚拟机,我要完成的是从物理系统读取虚拟机上的文件。我正在使用virtualbox api(pyvbox)与virtualbox进行接口。这是我第一次使用virtualbox api。在更新>>> import virtualbox>>> vbox virtualbox.Vi…

java 调用 mahout_java – 运行Mahout本地获取MahoutDriver的ClassNotFoundException

我试图在Windows 8机器上本地运行Mahout(没有Hadoop).我意识到这不是最佳设置,但这就是我必须使用的.当我尝试运行bin / mahout时,我收到以下错误:$bin/mahoutMAHOUT_LOCAL is set, so we dont add HADOOP_CONF_DIR to classpath.no HADOOP_HOME set, running local…

java写hive自定义函数_hive自定义函数的实现和执行

1. 先建个maven工程,创建Java类,将你要实现的内容写进类的方法里,例如public class StringExt extends UDF{public String evaluate(String pnb){return "Hello " pnb;}}这个类的实现很简单,继承了org.apache.hadoop.h…

python创建文件夹用什么函数_Python——os.mkdir()在指定路径下创建文件夹 + 路径的连接理解...

Python——os.mkdir()在指定路径下创建文件夹 路径的连接理解发布时间:2018-11-16 17:08,浏览次数:512, 标签:Pythonosmkdir引子: 我在用路径连接函数 os.path.join() 时发现,其连接的各级目录必须首先存在&#xff0…

基于hadoop的商品推荐系统_【论文笔记】基于矩阵分解的推荐系统

本文是对经典论文的阅读笔记,大部分为论文的中文翻译内容(笔者英语水平也就六级飘过的水准,不喜勿喷)论文标题:Matrix factorization techniques for recommender systems随着Netflix竞赛的结果所示,矩阵分…

php fpm在哪配置,php7的php-fpm.conf文件在哪里

php7下的php-fpm.conf文件一般是在php的安装目录下的etc目录中,文件路径为/usr/local/php-fpm/etc/php-fpm.conf。php-fpm.conf是php-fpm进程管理器的配置文件。php-fpm.conf是php-fpm进程管理器的配置文件。文件路径:/usr/local/php-fpm/etc/php-fpm.co…

python 生成pdf页面大小_(Python)更改使用xtopd生成的PDF文件的页面大小和格式

我想用Python转换xlsx。我使用tablib和xtopdf模块构建了一个结构良好的表。工作出色!不幸的是,内容不适合一个pdf页面。所以我想把页面大小和格式改成水平A3。但我不知道这怎么可能。我的代码:import randomimport tablibfrom openpyxl impor…

php数组合并字段,PHP数组按要求合并

数组一:[0] > Array([rid] > 1[hf_rid] > 0[aid] > 1[uid] > 1[content] > 我肯定第一名[re_time] > 2017-10-10 10:59[nickname] > 就是这么帅)[1] > Array([rid] > 2[hf_rid] > 0[aid] > 1[uid] > 1[content] > 马蛋,中枪了[re_ti…

aba会导致问题_肌肤缺水会导致哪些问题呢?我们又该怎么判断呢?

一.如何判断皮肤是否缺水?01.脸部肌肤粗糙,有紧绷感很多人在日常中都会用到洗面奶吧,在用过洗面奶之后如果发现肌肤变得粗糙,有紧绷感,那么说明你的肌肤就需要补水了。02.化妆之后浮粉、起皮如果给肌肤补足充足的水分&…

php编写用户登录页面,js+php实现静态页面实时调用用户登陆状态的方法

这篇文章主要介绍了jsphp实现静态页面实时调用用户登陆状态的方法,采用在静态页面中使用js调用php页面从而实现用户登录状态的实时调用功能,需要的朋友可以参考下本文实例讲述了jsphp实现静态页面实时调用用户登陆状态的方法。分享给大家供大家参考。具体分析如下:在…

python调试和测试有什么区别和联系_软件测试和测试开发到底有什么区别跟联系?...

对于没有进入IT领域的同学而言,软件测试并不陌生,但如果听到测试开发,他们一定会感到十分困惑,这究竟是测试还是开发呢?按照字面意思理解,大家或许会觉得测试开发是指既能开发产品又能测试产品的“技术王者…

php 远程图片合拼,php获取远程图片的三种方式

来源:http://www.phstar.cn/article/258.html下面介绍 3种php远程获取图片的方法,希望对大家有帮助。1:file_get_contents,file_put_contents方式function download_remote_file($file_url, $save_to){$content file_get_contents($file_url…

python蒙特卡洛模拟_基于Python的21点游戏蒙特卡洛模拟

问题重述:大多数赌场使用6副牌或8副牌玩这种游戏,以防止“数牌点”,在你的模拟中使用两副牌(共104张)。只有2位参与者,你和庄家。游戏开始时每人得到两张牌,对于牌面为2~10的牌,点数和面数相同;…

php 接受 amp,php中amp;amp;和||的用法

这两个是php 中的关系运算符。php中的关系运算符有:&&(and)、||(or)、xor(亦或)、!(非)、名称 关系 示例 结果and 与 $x and $y 如果 $x 和 $y 都为 true,则返回 true。or 或 $x or $y …

spring更新后 外层事务查不到_再深一点:面试工作两不误,源码级理解Spring事务...

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。Spring有5种隔离级别,7种传播行为。这是面试常问的内容,也是代码中经常碰到的知识点。这些知识枯燥而且乏味,其中有些非常的绕…

php 字符串比较txt,PHP读到txt中文字符串比较失败

最近开始做PHP。今天从txt文件中读取一个中文字符串,跟一个字符串作比较,老是匹配失败,开始以为是编码问题,因为我的PHP文件编码是utf-8,遂将txt文件的编码也改成utf-8,好,噩梦来了...我将读到的…

箭头函数的this指向谁_高阶函数

NodeJS 系列文章,本篇是第一篇,首先,预计将后续高频使用逻辑串一遍,依次是高阶函数,promise以及事件机制。本篇主要是高阶函数。call、bind、applycall、apply 都是改变 this 指向,区别是接受参数的方式不一…

php怎么加编码,php怎么设置编码格式

php设置编码格式的方法:首先在php脚本中添加【header(“Content-Type: text/html; charsetutf-8")】;然后在静态页面设置编码;最后保证所有文件的编码相同即可。如果要使用gb2312编码,那么php要输出头:(推荐教程&…

java 中文 音序,java 中文字符串数组按照音序排列

java 中文字符串数组按照音序排列复制代码 代码如下:public class SortComparator implements Comparator{public int compare(Object o1,Object o2) {try{byte[] buf1 ((String) o1).getBytes("unicode");byte[] buf2 ((String) o2).getBytes("unicode"…