其他需要注意的技术
本章完成以下内容:
- 缓存
- WTForms表单验证
- 添加 Favicon
- 扩展总结
一、缓存
如果您的应用运行很慢,那就尝试引入一些缓存吧。好吧,至少这是提高表现最简单的方法。缓存的工作是什么呢?比如说您有一个需要一段时间才能完成的函数,但是这个函数的返回结果可能在5分钟之内都是足够有效的,因此您可以将这个结果放到缓存中一段时间,而不用反复计算。
Flask 本身并不提供缓存功能,但是作为Flask 基础的 Werkzeug 库,则提供了一些基础的缓存支持。Werkzeug 支持多种缓存后端,通常的选择是 Memcached 服务器。
配置缓存
类似于建立 Flask 的对象一样,您创建一个缓存对象,然后让他保持存在。如果您使用的是开发服务器,您可以创建一个 SimpleCache 对象,这个对象将元素缓存在 Python 解释器的控制的内存中:
from werkzeug.contrib.cache import SimpleCache
cache = SimpleCache()
如果您希望使用 Memcached 进行缓存,请确保您已经安装了 Memcache 模块支持,您可以通过 PyPi 获取,并且有一个可用的 Memcached 服务器正在运行。然后您可以像下面这样连接到缓存服务器:
from werkzeug.contrib.cache import MemcachedCache
cache = MemcachedCache(['127.0.0.1:11211'])
如果您在使用 App Engine ,您可以轻易地通过下面的代码连接到 App Engine 的缓存服务器:
from werkzeug.contrib.cache import GAEMemcachedCache
cache = GAEMemcachedCache()
使用缓存
有两个非常重要的函数可以用来使用缓存。那就是 get() 函数和 set() 函数。他们的使用方法如下:
从缓存中读取项目,请使用 get() 函数, 如果现在缓存中存在对应项目,它将会返回。否则函数将会返回 None rv = cache.get('my-item')
在缓存中添加项目,使用 set() 函数。 第一个参数是想要设定的键,第二个参数是想要缓存的值。您可以设定一个超时时间, 当时间超过时,缓存系统将会自动清除这个项目。
以下是一个通常情况下实现功能完整例子:
def get_my_item():
rv = cache.get('my-item')
if rv is None:
rv = calculate_value()
cache.set('my-item', rv, timeout=5 * 60)
return rv
二、WTForms表单验证
如果您不得不跟浏览器提交的表单数据打交道,视图函数里的代码将会很快变得难以阅读。有不少的代码库被开发用来简化这个过程的操作。其中一个就是 WTForms , 这也是我们今天主要讨论的。如果您发现您自己陷入处理很多表单的境地,那您也许应该尝试一下他。
Flask-WTF 扩展在这个模式的基础上扩展并添加了一些随手即得的精巧的帮助函数,这些函数将会使在 Flask 里使用表单更加有趣,您可以通过 PyPI 获取它。
一个简单的例子:
# Model file
from wtforms import Form, BooleanField, TextField, PasswordField, validators
class RegistrationForm(Form):
username = TextField('Username', [validators.Length(min=4, max=25)])
email = TextField('Email Address', [validators.Length(min=6, max=35)])
password = PasswordField('New Password', [
validators.Required(),
validators.EqualTo('confirm', message='Passwords must match')
])
confirm = PasswordField('Repeat Password')
accept_tos = BooleanField('I accept the TOS', [validators.Required()])
# view file
@app.route('/register', methods=['GET', 'POST'])
def register():
form = RegistrationForm(request.form)
if request.method == 'POST' and form.validate():
user = User(form.username.data, form.email.data,
form.password.data)
db_session.add(user)
flash('Thanks for registering')
return redirect(url_for('login'))
return render_template('register.html', form=form)
# tempates file
{% macro render_field(field) %}
<dt>{{ field.label }}
<dd>{{ field(**kwargs)|safe }}
{% if field.errors %}
<ul class=errors>
{% for error in field.errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
</dd>
{% endmacro %}
备忘表:
1. 如果数据是以 POST 方式提交的,那么基于请求的 form 属性的值创建表单。反过来,如果是使用 GET 提交的,就从 args 属性创建。
2. 验证表单数据,调用 validate() 方法。如果数据验证通过,此方法将会返回 True ,否则返回 False 。
3. 访问表单的单个值,使用 form..data 。
三、添加 Favicon
一个普遍的问题是如何将一个 Favicon 添加到您的 Flask 应用中。首先,您当然得先有一个可用的图标,此图标应该是 16 x 16 像素的,且格式为 ICO 。这些虽然不是必需的规则,但是是被所有浏览器所支持的事实标准。将这个图标放置到您的静态文件目录下,文件名为 favicon.ico 。为了让浏览器找到您的图标,正确的方法是添加一个 Link 标签到 HTML 当中例如:
<link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}">
对于大多数浏览器来说,这就足够了。然后一些非常老的浏览器不支持这个标准。 原来的标准是在网站的根路径下,查找 favicon 文件,并使用它。如果应用程序不是挂在在域名的根路径,您要么需要配置 Web 服务器来在根路径提供这一图标, 要么您就很不幸地无法实现这一功能了。然而,如果您饿应用是在根路径,您就可以简单的配置一条重定向的路由:
app.add_url_rule('/favicon.ico', redirect_to=url_for('static', filename='favicon.ico'))
import os
from flask import send_from_directory
@app.route('/favicon.ico')
def favicon():
return send_from_directory(os.path.join(app.root_path, 'static'),
'favicon.ico', mimetype='image/vnd.microsoft.icon')
四、扩展总结
注意
flask 的拓展在较老的版本中,使用的 namespace 为:from flask.ext.** import **
而新版本的导入方法为:from flask_** import **
- flask-script 支持命令行选项
from flask_script import Manager
app = Manager(app)
- 使用 flask-bootstrap 集成 twitter bootstrap
from flask_bootstrap import Bootstrap
bootstrap = Bootstrap(app)
- 使用 flask-moment 本地化日期和时间
from flask_moment import Moment
moment = Moment(app)
- 使用 flask-sqlalchemy 管理数据库
from flask_sqlalchemy import SQLAlchemy
- Flask-Admin 登陆验证