flask web 编程学习笔记3:表单


表单作为一个常用的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)

发表评论

电子邮件地址不会被公开。 必填项已用*标注