文章目录
  1. 1. Flask-WTF的安装
  2. 2. 利用Flask-WTF创建表单
  3. 3. Flask-WTF验证表单
  4. 4. Flask-WTF的简单示例

这一段时间在学习Flask,真的是越学越觉得什么都不会。以前学习一些基础知识的时候一直觉得没什么用,结果现在才发现在开发的过程中,很多概念性的问题还是很重要的,比如HTTP协议、TCP/IP协议之类的知识,如果没有比较了解的话,开发起来其实很多时候尽管做得出来,也都是不明就里的,一旦遇到什么问题,很难知道应该从哪一个点入手。真的很难让我们不感叹道,经过短短几十年的发展,互联网或是计算机技术发展真的是太迅速了,没有哪一个学科在短短的时间内发展成为这么一个参天大树,每个树节点还在源源不断的为本体添枝加叶。

好了,老毛病又犯了,一吹起牛来根本停不下来~我们来谈谈在Flask开发中的一些好用的轮子吧,也就是Flask最最出名的插件,这一点它可是完美的继承了Python的衣钵,很容易就可以扩展出其他的功能。前提是只要你知道这个插件,知道怎么用就行了,举一反三,大多数的插件其实用法都有异曲同工之处。在开发网站的过程中,必不可少的就是Web表单,它主要在我们的网页中扮演着数据采集的功能。刚开始的时候我都是自己踩坑,手写表单,直到有一天我写累了,去逛了一下flask的网站,发现有个extensions,点进去看了一下,顺便看看了一些插件,突然之间了我看到了Flask——WTF,What’s the hell?(Flask-WTF offers simple integration with WTForms. This integration includes optional CSRF handling for greater security.)一个Web表单的插件,我当时的心情真的是Flask,what the fuck……

Ok,言归正传,我们今天就谈谈Flask-WTF这个插件。正如他自己介绍的那样,Flask—WTF提供了简单的WTForms集成,包括跨站请求伪造(CSRF),文件上传和验证码。具体功能如下:

  • 功能
  • 集成 wtforms。
  • 带有 csrf 令牌的安全表单。
  • 全局的 csrf 保护。
  • 支持验证码(Recaptcha)。
  • 与 Flask-Uploads一起支持文件上传。
  • 国际化集成。

Flask-WTF的安装

Flask的插件安装很简单,和Python安装插件一样,都可以通过pip和easy_install进行安装。

用pip安装Flask-WTF:
pip install Flask-WTF

用easy_install安装Flask-WTF:
easy_install Flask-WTF

但是,对Flask-WTF来说,我们有更好的选择,因为Flask-WTF是托管在在Github上的,并且在Github上面十分的活跃,我们可以直接clone他的代码库,获取最新的代码。

clone公共仓库:
git clone git://github.com/lepture/flask-wtf.git

下载 tarball:
$ curl -OL https://github.com/lepture/flask-wtf/tarball/master

下载 zipball:
$ curl -OL https://github.com/lepture/flask-wtf/zipball/master

当我们下载了Flask-WTF的代码之后,我们就可以执行以下代码,将其安装到我们Python的site-packages了:
python setup.py install

利用Flask-WTF创建表单

实际上,Flask-WTF的功能十分强大,单单是他下面整合的WTForms单元就已经能够基本满足一些小型网站的建设使用,比如我们的个人博客之类的小网站。

Flask-WTF提供了对WTForms的集成,创建示例代码如下:

1
2
3
4
5
6
from flask_wtf import Form
from wtforms import StringField
from wtforms.validators import DataRequired
class MyForm(Form):
name = StringField('name', validators=[DataRequired()])

与此同时,隐藏的CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。)令牌会被自动地创建,我们可以在模板中对它进行渲染,示例代码如下:

1
2
3
4
5
6
7
8
<form method="POST" action="/">
{{ form.csrf_token }}
<p>
Please enter your name:<br>
{{ form.name(size=20) }}<br>
</p>
<input type="submit" value="Go">
</form>

尽管如此,为了创建有效的XHTML/HTML,Form 类还会有一个hidden_tag方法, 它在一个隐藏的 DIV 标签中渲染任何隐藏的字段,包括 CSRF 字段:

1
2
3
4
5
6
7
8
<form method="POST" action="/">
{{ form.hidden_tag() }}
<p>
Please enter your name:<br>
{{ form.name(size=20) }}<br>
</p>
<input type="submit" value="Go">
</form>

这里说明一下,在我们的模板和常规的HTML表单之间存在着一些非常有意思的不同之处。模板想让我们在前面创建的表单类实例化成一个具体的表单对象,并把它存储成一个模板参数,成为form。这样在我们编写这个模板的视图函数的时候,我们就只要将具体的模板参数传递到这个模板上来就可以了。在上面代码中的form.hidden_tag() 模板参数将被替换为一个隐藏字段,用来是实现在配置中激活的CSRF保护。如果你已经激活了 CSRF,那么这个字段需要出现在你所有的表单中。

Flask-WTF验证表单

在我们的视图处理程序中通过视图函数来验证请求:

1
2
3
4
5
6
@app.route('/submit', methods=('GET', 'POST'))
def submit():
form = MyForm()
if form.validate_on_submit():
return redirect('/success')
return render_template('submit.html', form=form)

这里我们不需要把request.form传给Flask-WTFFlask-WTF会自动进行加载。而且validate_on_submit函数将会检查是否这是一个POST请求,并且验证请求是否有效。

Flask-WTF的简单示例

登陆视图函数(login()):

1
2
3
4
5
6
7
8
9
10
@app.route('/login', methods = ['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
flash('Login requested for Name="' + form.name.data + '",Login requested for PassWord="' + form.password.data + '", remember_me=' + str(form.remember_me.data))
return redirect('/index')
return render_template('login.html',
title = 'Sign In',
form = form
)

登陆模板(login.html):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!-- extend base layout -->
{% extends "base.html" %}
{% block content %}
<h1>Sign In</h1>
<form action="" method="post" name="login">
{{ form.hidden_tag() }}
<p>
Please enter your name:<br>
{{ form.name(size=20) }}<br>
{% for error in form.name.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}<br>
</p>
<p>
Please enter your password:<br>
{{ form.password(size=20) }}<br>
{% for error in form.password.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}<br>
</p>
<p>{{ form.remember_me }} Remember Me</p>
<p><input type="submit" value="Sign In"></p>
</form>
{% endblock %}

这里我们加入了字段验证,通常情况下,任何需要验证的字段都会把错误信息放入form.field_name.errors下。

Flask-WTF涉及的功能太多了,我们这里不能细细展开讲解,智能先讲一些比较基础的操作,还有一些比如CSRF保护、验证码、文件上传功能,下面有时间我会再单独拿出来细细的总结一下,毕竟我也是刚刚入门,感悟什么的还不够透彻,也不敢妄自评论,写出来和自己吹吹牛可大不一样哦,哈哈~写出来就应该比较严谨一点,不能太随便,哈哈,我不是为了输赢,我就是认真。顺便说一句,这几天好冷,码字手指都伸张不开了……

文章出自:Krzer http://www.krzer.com/版权所有。本站文章除注明出处外,皆为作者原创文章,可自由引用,但请注明来源。

文章目录
  1. 1. Flask-WTF的安装
  2. 2. 利用Flask-WTF创建表单
  3. 3. Flask-WTF验证表单
  4. 4. Flask-WTF的简单示例