文 / 秦未
今天学习Flask的表单处理,我们需要一个插件:flask-wtf
Flask-WTF 提供了简单的 WTForms 集成。
特性:
- 与 WTForms 的集成。
- 带有 CSRF 令牌的安全表单。
- 全局的 CSRF 保护。
- ecaptcha 支持。
- 支持 Flask-Uploads 的文件上传。
- 国际化集成。
下载安装:
pip install flask-wtf
我们这样理解flask生成的表单,定义它,其实就是定义一个类,然后通过flask-wtf的处理渲染,传到模板中。
所以我们建立一个forms.py文件,内容如下:
# /app/forms.py
# -*- coding:utf-8 -*-
from flask.ext.wtf import Form
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired
class LoginForm(Form):
username = StringField(label=u'账号', validators=[DataRequired()])
password = PasswordField(label=u'密码', validators=[DataRequired()])
submit = SubmitField(label=u'提交')
解释:我们定义一个LoginForm类,它继承了Form,我们在其中定义了3个字段,字符串类型(前端就是text),密码类型,提交类型,label为标签(即别名),validators属于验证,DataRequired其中的Required懂前端的都应该知道,它是input标签中要求字段必填的选项。
然后我们修改app.py中的login函数:
@app.route('/login/', methods=['GET', 'POST'])
def login():
# 判断请求方式
# if request.method == 'POST':
# # POST方式时数据是在form里面
# username = request.form.get('username')
# password = request.form.get('password')
# # 获取文件
# my_file = request.files.get('file')
# # 获取当前路径
# basepath = path.abspath(path.dirname(__file__))
# # 将路径连接
# upload_path = path.join(basepath, 'static/uploads/')
# # 保存文件并将文件名获取封装
# my_file.save(upload_path + secure_filename(my_file.filename))
# # 跳转upload函数
# return redirect(url_for('upload'))
# else:
# # GET方式时数据是在args里面
# username = request.args.get('username')
# password = request.args.get('password')
# return render_template('blog/login.html', method='GET')
from forms import LoginForm
form = LoginForm()
return render_template('blog/login.html', form=form)
login.html修改为:
{% extends 'blog/base.html' %}
{% block name %}
<h1>表单</h1>
<form action="{{ url_for('.login') }}" method="post" enctype="multipart/form-data">
{{ form.username.label }}
{{ form.username() }}
{{ form.password.label }}
{{ form.password() }}
{{ form.submit() }}
</form>
{% endblock %}
我觉得代码都很好明白吧!LoginForm()为实例化,传给login.html,form使用就是点点点。
当然你现在可以运行一下,你会发现报错:
KeyError: 'A secret key is required to use CSRF.'
此类框架在处理表单时都会有一个机制是为了防止CSRF攻击的,详细说明请看:浅谈CSRF攻击方式 - hyddd - 博客园
这个机制其实就是在表单提交的过程中加一个随机字符串,只有当客户端和服务器的随机字符串一致,后端才执行,看似简单的一个机制却有效防止了CSRF攻击。
所以:
我们建立一个config文件,内容:
SECRET_KEY = 'hard to guess string'
hard to guess string的意思是:很难猜到的字符串,随便你写了。
然后在app.py里面增加一条代码:
app.config.from_pyfile('config')
在manager = Manager(app)之前一行加即可,再次运行,你会发现:
详细文档请查阅:Flask-WTF 0.9.3 文档
官方并没有提供多少种数据类型的查询,这里有一张图统计了一下:
本来这里是讲引用Bootstrap样式的内容的,但是我又不想使用它,所以就略过。
---end---