Flask请求钩子

概述

钩子,hook,在程序设计中,一种常见的方式,意思是:将函数挂在钩子上,当满足某条件时,系统就会自动调用该函数

在Flask中,有4中请求钩子:

请求钩子 说明
before_first_request 处理第一个请求前,执行某函数
before_request 处理每一个请求前,执行某函数
after_request 执行视图函数后,如果没有抛出异常,就执行某方法
teardown_request 执行视图函数后,不论是否抛出异常,都执行某方法

在Flask中,请求钩子是通过 装饰器 的形式实现的

感性认识

# 处理第一个请求前,执行此函数
@app.before_first_request
def before_first_request():
    print('before_first_request')

# 处理每一个请求前,执行此函数
@app.before_request
def before_request():
    print('before_request')

# 执行视图函数后,如果没有抛出异常,就执行此方法
@app.after_request
def after_request(response):
    print('after_request',response)
    return response

# 执行视图函数后,不论是否抛出异常,都执行此方法。
# 不能用debug模式启动服务
# 不能用debug模式启动服务
# 不能用debug模式启动服务
# 不能用debug模式启动服务
# 不能用debug模式启动服务
# 不能用debug模式启动服务
@app.teardown_request
def teardown_request(response):
    print('teardown_request',response)
    return response

登录验证

最大的应用场景之一,就是登录验证:
比如在网上商城中,有一些操作,比如:收藏、购买、添加到购物车时,如果没有登录,就会显示登录界面

在实现这类功能时,需要在每个视图函数加上判断用户是否登录,如果没登录,就会跳转到登录界面,这种代码就显得冗余

可以采用请求钩子实现:

  1. 获取请求路径,当请求路径必须是登录后才能访问的路径时,从session中取出用户信息
  2. 如果有用户信息,说明已经登录,继续执行
  3. 如果没有用户信息,说明没有登录,跳转到登录页面
@app.before_request
def before_request():
    if request.path.find('/user')==0:
        userinfo=session.get('userinfo')
        if userinfo==None:
            return redirect('/static/login.html')