表单作为一个常用的html选项,flask使用flask-WTF实现了常用的表单功能,实现简单方便。
复制代码,并执行,可以在浏览器中看到输入框:
- '''
- Note3. WTF And Example
- '''
- #
- #########################################################################
- #
- # 使用Flask-WTF可以处理表单,按照如下方式进行安装:
- # pip install flask-wtf
- #
- #########################################################################
- #
- from flask import Flask, render_template, session, redirect, url_for, flash
- # wtf about import file
- from flask.ext.wtf import Form
- from wtforms import StringField, SubmitField
- from wtforms.validators import Required
- from flask.ext.bootstrap import Bootstrap
- #
- app = Flask(__name__)
- #
- # 1) Flask-WTF 能保护所有表单免受跨站请求伪造(Cross-Site Request
- # Forgery,CSRF)的攻击。恶意网站把请求发送到被攻击者已登录的其他网站时
- # 就会引发CSRF 攻击。
- # 2) 为了实现CSRF 保护,Flask-WTF 需要程序设置一个密钥。Flask-WTF使用
- # 这个密钥生成加密令牌,再用令牌验证请求中表单数据的真伪。
- #
- app.config['SECRET_KEY'] = 'hard to guess string'
- #
- bootstrap = Bootstrap(app)
- #
- class NameForm(Form):
- #
- # 使用Flask-WTF 时,每个Web 表单都由一个继承自Form 的类表示。
- # NameForm 表单中有一个名为name的文本字段和一个名为submit的提交按钮。
- # Form 基类由Flask-WTF扩展定义,所以从flask.ext.wtf中导入。字段和验
- # 证函数却可以直接从WTForms 包中导入。
- #
- name = StringField('What is your name?', validators=[Required()])
- submit = SubmitField('Submit')
- #
- # Form支持的字段:
- # |----------------------------------------------------------------------
- # | 字段类型 | 说 明
- # |----------------------------------------------------------------------
- # | StringField | 文本字段
- # | TextAreaField | 多行文本字段
- # | PasswordField | 密码文本字段
- # | HiddenField | 隐藏文本字段
- # | DateField | 文本字段,值为datetime.date 格式
- # | DateTimeField | 文本字段,值为datetime.datetime 格式
- # | IntegerField | 文本字段,值为整数
- # | DecimalField | 文本字段,值为decimal.Decimal
- # | FloatField | 文本字段,值为浮点数
- # | BooleanField | 复选框,值为True 和False
- # | RadioField | 一组单选框
- # | SelectField | 下拉列表
- # | SelectMultipleField | 下拉列表,可选择多个值
- # | FileField | 文件上传字段
- # | SubmitField | 表单提交按钮
- # | FormField | 把表单作为字段嵌入另一个表单
- # | FieldList | 一组指定类型的字段
- # |------------------------------------------------------------------------
- # WTForms 内建的验证函数:
- # |------------------------------------------------------------------------
- # | 验证函数 | 说 明
- # |------------------------------------------------------------------------
- # | Email | 验证电子邮件地址
- # | EqualTo | 比较两个字段的值;常用于要求输入两次密码进行确认的情况
- # | IPAddress | 验证IPv4 网络地址
- # | Length | 验证输入字符串的长度
- # | NumberRange | 验证输入的值在数字范围内
- # | Optional | 无输入值时跳过其他验证函数
- # | Required | 确保字段中有数据
- # | Regexp | 使用正则表达式验证输入值
- # | URL | 验证URL
- # | AnyOf | 确保输入值在可选值列表中
- # | NoneOf | 确保输入值不在可选值列表中
- # |------------------------------------------------------------------------
- #
- @app.route('/', methods=['GET', 'POST'])
- def index():
- # 用户第一次访问程序时,服务器会收到一个没有表单数据的GET 请求,
- # 所以validate_on_submit() 将返回False。if 语句的内容将被跳过,
- # 通过渲染模板处理请求,并传入表单对象和值为None 的name 变量作
- # 为参数。用户会看到浏览器中显示了一个表单。
- name = None
- form = NameForm()
- # 提交表单后,如果数据能被所有验证函数接受,那么validate_on_submit()
- # 方法的返回值为True,否则返回False。
- if form.validate_on_submit():
- name = form.name.data
- form.name.data = ''
- return render_template('wtf.html', form=form, name=name)
- '''
- or : 重定向的方式,采用session记录上下文。
- session['name'] = form.name.data
- return redirect(url_for('index'))
- return render_template('wtf.html', form=form, name=session.get('name'))
- or : flash 消息用来提示客户状态值。
- if old_name is not None and old_name != form.name.data:
- flash('Looks like you have changed your name!')
- session['name'] = form.name.data
- return redirect(url_for('index'))
- return render_template('index.html',\
- form = form,\
- name = session.get('name'))
- '''
- # 注,传递flash消息时,需要修改html,增加:{% for message in get_flashed_messages() %}
- if __name__ == '__main__':
- app.run(debug=True)