flask mail 支持html,Flask Web 开发 Chapter4 - Web 表单

处理Web表单的扩展 Flask-WTF

Flask-wtf 对WTForms包进行了包装,方便集成入Flask框架

跨站请求保护

CSRF(Cross-Site Request Forgery)是指恶意网站把请求发送到被攻击者已登录的其他网站就会引发CSRF攻击

为了实现CSRF保护,需要程序设置密钥,生成加密令牌,再用来验证表单数据真伪。非常简单:

app = Flask(__name__)

app.config['SECRET_KEY'] = 'hard to guess string'

不过在生产环境,不会直接写入程序,而会从文件或环境中导入配置值,Flask-wtf提供了方法来实现

表单类

使用Flask-wtf时,每一个表单都由一个继承自Form类表示,这个类定义表单的字段,每个字段由对象表示,

字段对象可以附属一个或多个验证函数,验证函数负责验证用户提交输入值是否符合要求

示范:

from flask.ext.wtf import Form

from wtforms import StringField,SubmitField

from wtforms.validators import DataRequired,Email

class NameForm(Form):

name = StringField('what is your name ?',validators=[DataRequired()])

email = StringField('what is your email ?',validators=[Email()])

submit = SubmitField('Submit')

上面代码定义了3个字段:name,email,submit三个字段,name和email表示"text" 的input元素,

submit表示type = 'submit'的“input”元素。DataRequired接受用户输入之后,确保提交字段不为空,

Email确保输入为符合邮件的函数

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

比较2个字段值,一般用于输入2次密码进行确认情况

IPAddress

验证IPV4地址

Length

验证输入字符长度

Optional

无输入值时跳过其他验证函数

Required

确保字段有值

Regxp

使用正则表达式验证输入值

URL

验证URL

AnyOf

确保输入值在可选值列表中

NoneOf

确保输入值不在可选值列表

表单渲染成HTML

Flask-Bootstrap提供了一个辅助函数,使用Bootstrap预先定义好的表单样式渲染Flask-Wtf表单对象,使用Bootstrap默认样式渲染传入的表单。

还可以使视图函数渲染表单,接收表单数据

py:

@app.route('/',methods=['GET','POST'])

def index():

name = None

email = None

form = NameForm()

if form.validate_on_submit():

name = form.name.data

email = form.email.data

form.name.data = ''

form.email.data = ''

return render_template('index.html',form=form,name=name)

html:

{{ wtf.quick_form(form) }}

重定向和用户会话

如果使用上面的视图函数,重复点击链接会再次提交表单,让你确认。

不过可以重定向POST请求,重新向重定向的URL发起GET请求,显示页面内容 - POST/重定向/GET,模式

不过,处理POST请求时,如果不保存数据,下次请求来时,数据就已经丢失。

不过,可以通过用户会话(session)保存数据,并且像python字典一样操作

默认情况下,用户会话保存在cookie中,而且cookie使用SECRET_KEY加密

示范代码:

@app.route('/',methods=['GET','POST'])

def index():

form = NameForm()

if form.validate_on_submit():

session['name'] = form.name.data

session['email'] = form.email.data

return redirect(url_for('index')) # url_for重定向必须是相应视图函数的名字

return render_template('index.html',form=form,name=session.get('name'),email=session.get('email'))

Flash消息

如果状态发生变化,可以通过flash()通知用户 -确认消息,警告或者错误提醒 FLask的核心特性

不过仅仅调用flash()不能把消息显示,还需要模板渲染消息,最好在基模板渲染,这样所有页面都能使用。

py:

@app.route('/',methods=['GET','POST'])

def index():

form = NameForm()

if form.validate_on_submit():

oldname = session['name']

if oldname is not None and oldname!=form.name.data:

flash('Looks like you have changed your name!')

old_email = session['email']

if old_email is not None and old_email !=form.email.data:

flash('Email changed!')

session['name'] = form.name.data

session['email'] = form.email.data

return redirect(url_for('index')) # url_for重定向必须是相应视图函数的名字

return render_template('index.html',form=form,name=session.get('name'),email=session.get('email'))

html:

{% for msg in get_flashed_messages() %}

×

{{ msg }}

{% endfor %}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值