web表单:
制作简易表单有几个步骤:
1, 跨站请求伪造保护
2, 表单类
3, 在视图函数中处理表单
4, 在html文件中处理表单
5, 关于重定向和用户会话
—- – – ———分割线之具体步骤
0,先安装
pip install flask-wtf
1, 老规矩,先在hello.py中修改代码,Cross-Site Request Forgery ,flask-wtf能保护所有表单免CSRF攻击,所以必须写密钥,代码:
app.config['SECRET_KEY'] ='hard to guess' #SECRET_KEY
本应在配置文件中,此处暂时用字符串替代
2, 继续在hello.py ,建立表单类,继承自Form 类,附录中有WTForms支持的HTML标准字段以及验证函数,代码:
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')
3, 继续hello.py,视图函数处理表单:
@app.route('/',methods=['GET','POST'])
def index():
name=None
myform = NameForm()
if myform.validate_on_submit():
name = myform.name.data
myform.name.data=''
return render_template('formindex.html',form=myform,name=name)
两点:validate_on_submit()方法:如果数据能被所有验证函数接受,比如调用name字段附属的验证函数Required(),那么validate_on_submit()方法的返回值为True,否则False.
第二点,访问表单里的值:form..data
4, 开始在index.html文件中,渲染表单比较快速高效的方法利用Bootstrap 渲染Flask-WTF表单对象的辅助函数,wtf.quick_form()函数的参数为Flask-WTF表单对象:
{% extends 'base.html' %}
{% import 'bootstrap/wtf.html' as wtf %}
{% block title %} Flasky {% endblock %}
{% block page_content %}
<div class="page-header">
<h1>Hello,{% if name %}
{{ name }}
{% else %}
Stranger
{% endif %}!</h1>
</div>
{{ wtf.quick_form(form) }}
{% endblock %}
5, 上效果图:
6, 重定向和用户会话,
Question:
提交表单后再刷新,会看到浏览器警告,要求在再次提交表单之前进行确认,而大多数使用浏览器上网的用户不都是懂计算机技术,用户对浏览器的警告不太理解,肯定用户体验就不太好了,所以要避免这种弹出的警告窗。
AC:
首先为什么会有这种情况,因为刷新会让浏览器重新发送之前已经发送过的最后一个请求,而若这个请求为POST,则刷新后重新提交表单,就警告了。解决思路:使用重定向作为POST的响应,重定向的响应内容为URL,而URL会发送GET请求,解决弹窗警告。这种方法带来另一个问题,因为POST使用重定向处理,一旦请求结束,数据就丢失,所以得用session来保存数据。
@app.route('/',methods=['GET','POST'])
def index():
name=None
myform = NameForm()
if myform.validate_on_submit():
session['name']= myform.name.data
return redirect(url_for('index'))
return render_template('formindex.html',form=myform,name=session.get('name'))
附录:
WTForms支持的HTML标准字段
WTForms 的验证函数