概述
钩子,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
登录验证
最大的应用场景之一,就是登录验证:
比如在网上商城中,有一些操作,比如:收藏、购买、添加到购物车时,如果没有登录,就会显示登录界面
在实现这类功能时,需要在每个视图函数加上判断用户是否登录,如果没登录,就会跳转到登录界面,这种代码就显得冗余
可以采用请求钩子实现:
- 获取请求路径,当请求路径必须是登录后才能访问的路径时,从session中取出用户信息
- 如果有用户信息,说明已经登录,继续执行
- 如果没有用户信息,说明没有登录,跳转到登录页面
@app.before_request
def before_request():
if request.path.find('/user')==0:
userinfo=session.get('userinfo')
if userinfo==None:
return redirect('/static/login.html')