Flask学习日志(十) - Flask入门 表单

Flask学习日志(十) - Flask入门 表单_第1张图片
每日壁纸.jpg

文 / 秦未

今天学习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 %}

表单

{{ form.username.label }} {{ form.username() }} {{ form.password.label }} {{ form.password() }} {{ form.submit() }}
{% 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学习日志(十) - Flask入门 表单_第2张图片
运行状态.png

详细文档请查阅:Flask-WTF 0.9.3 文档

官方并没有提供多少种数据类型的查询,这里有一张图统计了一下:

Flask学习日志(十) - Flask入门 表单_第3张图片
数据类型.png

本来这里是讲引用Bootstrap样式的内容的,但是我又不想使用它,所以就略过。

---end---

你可能感兴趣的:(Flask学习日志(十) - Flask入门 表单)