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可以换成任意的变量,只要在视图中赋值就可以了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2015-11-07 19:35  小步快跑&  阅读(363)  评论(0编辑  收藏  举报