[python3.6 flask web学习]Flask表单构建

flask对于表单的处理,采用单独的扩展模板Flask-WTF.该模块可以直接定义表单类,然后到前端生成表单,同时可以附加额外的功能,比如防止csrf攻击,防止表单重复提交,进行表单数据验证等。

1.csrf(跨站请求伪造)攻击

Flask-WTF采用程序中设置一个密钥,然后生成一个token进行表单验证,对这种攻击进行保护。

app = Flask(__name__)
app.config['SECRET_KEY'] = "a complex string"

app.config是用来存储框架、程序、扩展的配置变量的。SECRET_KEY是一个通用的密钥,可以在Flask和其他扩展模块中使用。一般为了安全,这个值是不直接写在程序里面的的,而是配置在环境变量中。


2.web表单

每个前端表单都对应着后台的一个表单类,可以先定义好表单字段,过滤函数等,然后在生成相应的表单,表单类继承自Flask-WTF模块的Form类。下面定义一个表单,包含一个字和字段的验证函数和一个按钮。

from flask.ext.wtf import Form
from wtforms import StringField, SubmitField
from wtforms.validators import Required

class NameForm(Form):
    name = StringField('What is your name',  validators = [Required])
    submit = SubmitField('Submit')

StringField为WTForms中的文本字段,他的第一个参数为label,Required验证函数表明name字段为必填的。使用form.validate_on_submit()便可以确定用户输入的参数是否验证通过。

WTForms支持一下的html标准字段

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 确保输入值不在可选值列表中


3.表单类渲染成html表单

可以直接创建一个表单类实例,然后传入到前端生成表单

<form>
    {{form.hidden_tag()}}
    {{form.name.label}} {{form.name()}}
    {{form.submit()}}
</form>

也可以在name()或者submit()里面传入参数如id或者class,进行表单样式定义。

更简单的渲染方法是采用Flask-Bootstrap提供的辅助函数。导入预先定义好的宏,采用直接传入表单类实例就可以快速的渲染出一个美观的表单

{% import "bootstrap/wtf.html" as wtf %}
{{ wtf.quick_form(form) }}


明白了如何渲染表单之后,就可以写一个完成的表单程序了。

定义模板

{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}

{% block title %}form practice{% endblock %}
{% block page_content %}
<div class="page-header">
    <h1>hello, {% if name %} {{ name }} {% else %}Stranger{% endif %}</h1>
</div>
{{wtf.quick_form(form)}}
{% endblock %}

处理表单的视图函数。

@app.route('/', methods=['GET','POST'])
def index():
    name = None
    form = NameForm() //表单类实例
    if form.validate_on_submit()://如果验证通过
        name = form.name.data //获取表单name字段的值
        form.name.data = ''
    return render_template('index.html', form = form, name = name)

4.Flask重定向和消息

Flask重定向函数redirect

Flask提供一个函数直接存储用户的消息,flash('my info')。消息加入之后可以在使用get_flashed_messages()获取所有flash里面存储的消息,消息一旦取出来显示了就不会存在里面,类似于队列的pop

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值