The Flask Mega-Tutorial Part III:Web Forms

Flask-WTF

Flask-WTF是Flask的扩展(Extension),它对WTForm包进行一个轻量的封装使之能很好的适应Flask。Extension是Flask的一个非常重要的部分,它们能够提供一些Flask本身不具有的特性。
当然,Flask extensions本质上还是Python的包, 自然可以通过pip工具直接下载安装。

Configuration

你会发现有时Flask会有一些自由的参数,这可以通过一个配置变量列表去控制,例如:

app = Flask(__name__)
app.config['SECRET_KEY']='you-will-never-guess'

通常会使用一个类去存储配置变量信息。例如,新建个文件config.py

class Config(object):
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'you-will-never-guess'

有了config.py文件后,还需要告诉Flask,让它去读该配置文件,修改__init__.py为:

from flask import Flask
from config import Config #导入上面的配置文件

app = Flask(__name__)
app.config.from_object(Config)#flask读配置文件

from app import routes

创建一个登录表格

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, SubmitField
from wtforms.validators import DataRequired

class LoginForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired()])
    password = PasswordField('Password', validators=[DataRequired()])
    remember_me = BooleanField('Remember Me')
    submit = SubmitField('Sign In')
#login.html
{% extends "base.html" %}
{% block content %}
    <h1>Sign In</h1>
    <form action="" method="post">
        {{ form.hidden_tag() }}
        <p>
            {{ form.username.label }}<br>
            {{ form.username(size=32) }}
            #错误信息处理
            {% for error in form.username.errors %}
            <span style="color: red;">[{{ error }}]</span>
            {% endfor %}
        </p>
        <p>
            {{ form.password.label }}<br>
            {{ form.password(size=32) }}
            {% for error in form.password.errors %}
            <span style="color: red;">[{{ error }}]</span>
            {% endfor %}
        </p>
        <p>{{ form.remember_me() }} {{ form.remember_me.label }}</p>
        <p>{{ form.submit() }}</p>
    </form>
{% endblock %}
在routes.py末尾添加
@app.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        flash('Login requested for user {}, remember_me={}'.format(form.username.data,form.remember_me.data))
        return redirect(url_for('index'))
    return render_template('login.html',  title='Sign In', form=form)
    #flash()向user展示信息。虽然,调用flash()函数,Flask会保存信息,但是这些并不会自动的显示在web页面。这需要通过修改模板来实现,下面将修改base.html模板使得所有继承该模板的都能实现该功能
#base.html
<html>
    <head>
        {% if title %}
        <title>{{ title }} - microblog</title>
        {% else %}
        <title>microblog</title>
        {% endif %}
    </head>
    <body>
        <div>
            Microblog:
            <a href="/index">Home</a>
            <a href="/login">Login</a>
        </div>
        <hr>
        {% with messages = get_flashed_messages() %}
        {% if messages %}
        <ul>
            {% for message in messages %}
            <li>{{ message }}</li>
            {% endfor %}
        </ul>
        {% endif %}
        {% endwith %}
        {% block content %}{% endblock %}
    </body>
</html>
#get_flashed_messgaes()返回一个之前注册在flashd()的消息列表
posted @ 2018-02-08 16:00  blog_hfg  阅读(98)  评论(0)    收藏  举报