Flask03-Form

## Web 表单 配置

    为了能够处理 web 表单,我们将使用 Flask-WTF ,该扩展封装了 WTForms 并且恰当地集成进 Flask 中。

    许多 Flask 扩展需要大量的配置,因此我们将要在 microblog 文件夹的根目录下创建一个配置文件以至于容易被编辑。这就是我们将要开始的(文件 config.py):

    $ config.py
    > CSRF_ENABLED = True
    > SECRET_KEY = 'you-will-never-guess'

    // 告诉 Flask 去读取配置文件 app/__init__.py

    > from flask import Flask
    >
    > app = Flask(__name__)
    > app.config.from_object('config')
    >
    > from app import views

## 用户登录表单

    在 Flask-WTF 中,表单是表示成对象,Form 类的子类。一个表单子类简单地把表单的域定义成类的变量。

    我们将要创建一个登录表单,用户用于认证系统。在我们应用程序中支持的登录机制不是标准的用户名/密码类型,我们将使用 OpenID。OpenIDs 的好处就是认证是由 OpenID 的提供者完成的,因此我们不需要验证密码,这会让我们的网站对用户而言更加安全。

    OpenID 登录仅仅需要一个字符串,被称为 OpenID。我们将在表单上提供一个 ‘remember me’ 的选择框,以至于用户可以选择在他们的网页浏览器上种植 cookie ,当他们再次访问的时候,浏览器能够记住他们的登录。

    $ vim 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)

## 表单模板

    $ vim app/templates/login.html
    > 
    > {% extends "base.html" %}
    >
    > {% block content %}
    > 

Sign In

>
"" method="post" name="login"> > {{form.hidden_tag()}} >

> Please enter your OpenID:
> {{form.openid(size=80)}}
>

>

{{form.remember_me}} Remember Me

>

"submit" value="Sign In">

>
> {% endblock %} ## 表单视图 $ vim app/views.py > from flask import render_template, flash, redirect > from app import app > from .forms import LoginForm > > # index view function suppressed for brevity > > @app.route('/login', methods = ['GET', 'POST']) > def login(): > form = LoginForm() > return render_template('login.html', > title = 'Sign In', > form = form) ## 接收表单数据 // 验证表达数据是否正确(form.validate_on_submit),调用flash()显示消息 $ vim app/views.py > @app.route('/login', methods = ['GET', 'POST']) > def login(): > form = LoginForm() > if form.validate_on_submit(): > flash('Login requested for OpenID="' + form.openid.data + '", remember_me=' + str(form.remember_me.data)) > return redirect('/index') > return render_template('login.html', > title = 'Sign In', > form = form) // flash显示消息 $ vim app/templates/base.html <head> {% if title %} {{title}} - microblog {% else %} microblog {% endif %} head>
Microblog: "/index">Home

{% with messages = get_flashed_messages() %} {% if messages %}
    {% for message in messages %}
  • {{ message }}
  • {% endfor %}
{% endif %} {% endwith %} {% block content %}{% endblock %} ## 加强字段验证 $ vim app/templates/login.html > > {% extends "base.html" %} > > {% block content %} >

Sign In

>
"" method="post" name="login"> > {{ form.hidden_tag() }} >

> Please enter your OpenID:
> {{ form.openid(size=80) }}
> {% for error in form.openid.errors %} > "color: red;">[{{ error }}] > {% endfor %}
>

>

{{ form.remember_me }} Remember Me

>

"submit" value="Sign In">

>
> {% endblock %} ## 处理 OpenIDs $ vim config.py > OPENID_PROVIDERS = [ > { 'name': 'Google', 'url': 'https://www.google.com/accounts/o8/id' }, > { 'name': 'Yahoo', 'url': 'https://me.yahoo.com' }, > { 'name': 'AOL', 'url': 'http://openid.aol.com/' }, > { 'name': 'Flickr', 'url': 'http://www.flickr.com/' }, > { 'name': 'MyOpenID', 'url': 'https://www.myopenid.com' }] $ vim app/view.py > return render_template('login.html', > title = 'Sign In', > form = form, > providers = app.config['OPENID_PROVIDERS']) $ vim app/templates/login.html) > > {% extends "base.html" %} > > {% block content %} > >

Sign In

>
"" method="post" name="login"> > {{ form.hidden_tag() }} >

> Please enter your OpenID, or select one of the providers below:
> {{ form.openid(size=80) }} > {% for error in form.openid.errors %} > "color: red;">[{{error}}] > {% endfor %}
> |{% for pr in providers %} > "javascript:set_openid('{{ pr.url }}', '{{ pr.name }}');">{{ pr.name }} | > {% endfor %} >

>

{{ form.remember_me }} Remember Me

>

"submit" value="Sign In">

>
> {% endblock %}

 

你可能感兴趣的:(Flask03-Form)