flask笔记二
web表单
web表单是浏览者和网之间的一个互动平台,完成浏览器和服务器之间的数据交互。
1、用Flask-WTF来处理表单
(1)在根目录下编辑扩展配置--config.py
CSRF_ENABLED = True SECRET_KEY = 'you-will-never-guess'
CSRF_ENABLED配置跨站点保护,就是防止程序挟持用户执行非本意的操作,是一种web的攻击行为,这个设置会提高web的安全性。
SECRET_KEY是当CSRE(跨站请求伪造)激活时执行,实现加密用来验证表单,避免网站的恶意攻击。
(2)在Flask中读取该配置文件,(文件 app/__init__.py):
from flask import Flask app = Flask(__name__) app.config.from_object('config') from app import views
2、用户登录表单的实现
使用 Flask-WTF 时,每个 Web 表单都由一个继承自 Form 的类表示。这个类定义表单中的一组字段,每个字段都用对象表示。字段对象可
附属一个或多个验证函数。验证函数用来验证用户提交的输入值是否符合要求。在这个小程序中是由OpenId完成用户的验证的,类似于Hadoop中的SSH加密算法,不需要
调用数据库中的用户名和密码登录,浏览器会根据用户产生的cookie对用户进行识别。
现在新建第一个表单(app/forms.py):
from flask.ext.wtf import Form from wtforms import StringField, BooleanField from wtforms.validators import DataRequired class LoginForm(Form): openid = StringField('openid', validators=[DataRequired()]) remember_me = BooleanField('remember_me', default=False)
解释:StringField类表示属性为 type="text" 的 <input> 元素;BooleanField表示复选框,选择true或者flase。DataRequired 验证器只是简单地检查相应域提交的数据是否是空。
WTForms支持的HTML标准字段:
WTForms内置的验证函数:
3、创建表单模板
创建好表单,那么现在该做的就是用HTML模板实现表单中的功能。接着用HTML写出布局。
这里就是我们登录的模板(文件 app/templates/login.html):
1 <!-- extend from base layout --> 2 {% extends "base.html" %} 3 4 {% block content %} 5 <h1>Sign In</h1> 6 <form action="" method="post" name="login"> 7 {{form2.hidden_tag()}} 8 <p> 9 Please enter your OpenID:<br> 10 {{form2.openid(size=80)}}<br> 11 </p> 12 <p>{{form2.remember_me}} Remember Me</p> 13 <p><input type="submit" value="Sign In"></p> 14 </form> 15 {% endblock %}
♦需要注意的是,创建表单模板需要将表单中 “class LoginForm(Form)” 类中的功能 通过参数(这里是form2)传入模板。当我们编写渲染这个模板的视图函数的时候,我们将会特别注意传送这个模板参数到模板中。
♦form.hidden_tag() 模板参数将被替换为一个隐藏字段,用来是实现在配置中激活的 CSRF 保护。如果你已经激活了 CSRF,这个字段需要出现在你所有的表单中。
4、创建表单视图
现在完成渲染模板,因为功能已经在表单中实现,所以只需要在视图中调用一下表单即可。下面是视图文件( app/views.py):
1 from flask import render_template, flash, redirect 2 from app import app 3 from .forms import LoginForm 4 5 # index view function suppressed for brevity 6 7 @app.route('/login', methods = ['GET', 'POST']) 8 def login(): 9 form = LoginForm() 10 return render_template('login.html', 11 title = 'Sign In', 12 form2 = form)
在这里我特别将form2和form区别开来,form2其实就是模板中抽象的概念,没有实际的意义,只有在视图文件中指定它的功能时才被赋予form=LoginForm()的实
例化的功能。也就是上面的模板中form2可以换成任意的变量,只要在视图中赋值就可以了。