认证:
Flask-Login 扩展可以很容易地实现登录系统。
除了处理用户认证的细节,Flask-Login 提供给我们一个装饰器,
它用来限制只允许登录的用户访问某些视图: @login_required。
# app.py
from flask import render_template
from flask.ext.login import login_required, current_user
@app.route('/')
def index():
return render_template("index.html")
@app.route('/dashboard')
@login_required
def account():
return render_template("account.html")
@app.route 应该是外层的视图装饰器(换句话说,@app.route 应该在所有装饰器的最前面)。
缓存
何才能加快访问速度,让所有的访客都不会错过我们的网站?
确切地来说,我们将要使用 Flask-Cache 扩展。
这个扩展提供我们一个装饰器,我们可以在我们的首页视图上使用这个装饰器用来在一段时间内缓存响应。
这个代码块显示我们的缓存装饰器视图是什么样子的。
# app.py
from flask.ext.cache import Cache
from flask import Flask
app = Flask()
# We'd normally include configuration settings in this call
cache = Cache(app)
@app.route('/')
@cache.cached(timeout=60)
def index():
[...] # Make a few database calls to get the information we need
return render_template(
'index.html',
latest_posts=latest_posts,
recent_users=recent_users,
recent_photos=recent_photos
)
自定义装饰器
应用程序每个月都会向用户收费。如果用户的账号已经过期,我们将会重定向到收费页面并且让用户升级。
from functools import wraps
from datetime import datetime
from flask import flash, redirect, url_for
from flask.ext.login import current_user
def check_expired(func):
@wraps(func)
def decorated_function(*args, **kwargs):
if datetime.utcnow() > current_user.account_expires:
flash("Your account has expired. Update your billing info.")
return redirect(url_for('account_billing'))
return func(*args, **kwargs)
return decorated_function
1、当一个函数使用 @check_expired 装饰,check_expired() 被调用并且被装饰的 函数被作为参数进行传递。
2、@wraps 是一个装饰器,它做了一些工作使得 decorated_function() 看起来像 func()。这使得函数的行为多了几分自然。
3、decorated_function 将会获取所有我们传递给原始视图函数 func() 的 args 和 kwargs。我们在这里检查用户的账号是否过期。如果已经过期的话, 我们将会闪现一条消息并且重定向到一个收费页面。
4、现在我们已经做了我们想要做的事情,我们使用它原始的参数运行被装饰的视图函数 func()。
URL转换器
当你在 Flask 中定义路由的时候,你可以指定路由的一部分,它们将会转换成 Python 变量并且传递到视图函数。
@app.route('/user/<username>')
def profile(username):
pass
在 URL 中的 将会作为 username 参数传入到视图。你也可以指定一个转换器,用来在变量传入视图之前对其进行过滤筛选。
@app.route('/user/id/<int:user_id>')
def profile(user_id):
pass
自定义转换器
我们也能准备自定义转换器来满足自己的需求。
我们可以在我们自己的 Flask 应用程序中使用一个自定义的转换器来实现这个功能。
详细看官网