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()的消息列表

浙公网安备 33010602011771号