用户第一次访问程序时,服务器会收到一个没有表单数据的 GET 请求,所以 validate_on_submit() 将返回 False 。 if 语句的内容将被跳过,通过渲染模板处理请求,并传入表单对象和值为 None 的 name 变量作为参数。用户会看到浏览器中显示了一个表单
@app.route('/', methods=['GET', 'POST'])
def index():
name = None
form = NameForm()
if form.validate_on_submit():
name = form.name.data
form.name.data = ''
return render_template('index.html', form=form, name=name)
from flask import redirect
....。 redirect() 函数的参数是重定向的 URL,这里使用的重定向URL 是程序的根地址,因此重定向响应本可以写得更简单一些,写成 redirect('/') ,但却会使用 Flask 提供的 URL 生成函数 url_for() 。推荐使用 url_for() 生成 URL,因为这个函数使用 URL 映射生成 URL,从而保证 URL 和定义的路由兼容,而且修改路由名字后依然可用.
url_for() 函数的第一个且唯一必须指定的参数是端点名,即路由的内部名字。默认情况下,路由的端点是相应视图函数的名字。在这个示例中,处理根地址的视图函数是index() ,因此传给 url_for() 函数的名字是index 。
关系和查询的处理方式类似。下面这个例子分别从关系的两端查询角色和用户之间的一对
多关系:
>>> users = user_role.users
>>> users
[<User u'susan'>, <User u'david'>]
>>> users[0].role
<Role u'User'>
这个例子中的 user_role.users 查询有个小问题。执行 user_role.users 表达式时,隐含的
查询会调用 all() 返回一个用户列表。 query 对象是隐藏的,因此无法指定更精确的查询
过滤器。就这个特定示例而言,返回一个按照字母顺序排序的用户列表可能更好。在示例
5-4 中,我们修改了关系的设置,加入了 lazy = 'dynamic' 参数,从而禁止自动执行查询。
示例 5-4 hello.py :动态关系
class Role(db.Model):
...
users = db.relationship('User', backref='role', lazy='dynamic')
...
这样配置关系之后, user_role.users 会返回一个尚未执行的查询,因此可以在其上添加过
滤器:
>>> user_role.users.order_by(User.username).all()
[<User u'david'>, <User u'susan'>]
>>> user_role.users.count()
2
连接到外部SMTP服务器:
示例 6-1 hello.py :配置 Flask-Mail 使用 Gmail
import os
...
app.config['MAIL_SERVER'] = 'smtp.googlemail.com'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME')
app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD')
千万不要把账户密令直接写入脚本,特别是当你计划开源自己的作品时。为
了保护账户信息,你需要让脚本从环境中导入敏感信息。
保存电子邮件服务器用户名和密码的两个环境变量要在环境中定义。如果你在 Linux 或
Mac OS X 中使用 bash,那么可以按照下面的方式设定这两个变量:
(venv) $ export MAIL_USERNAME=<Gmail username>
(venv) $ export MAIL_PASSWORD=<Gmail password>