Flask——视图和路由的进阶技能

官网是最好的地方

认证:

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 应用程序中使用一个自定义的转换器来实现这个功能。
详细看官网

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值