Flask-cache缓存-请求钩子

1.flask-cache 缓存插件

安装:pip install flask-cache
使用方式:
# 1. 完全使用Redis 的默认缓存配置
# 缓存到本地端口 6379 的 Redis 的0号库
cache = Cache(config={"CACHE_TYPE":"redis"}) 
cache.init_app(app程序实例)

@cache.cached(timeout=超时时间秒数,key_prefix='可以设置缓存key的前缀')
def 视图函数名称():
	耗时操作
'''
	注意:如果使用的flask-cache插件是0.13.1版本,则需要将jinja2ext.py源码中
        第33行代码修改为:from flask_cache import make_template_fragment_key。
'''

# 2. 使用完整的Redis配置
cache_config = {
	"CACHE_TYPE":"redis",
	# redis 所在主机
	"CACHE_REDIS_HOST":"10.12.155.62",
	# redis 端口
	"CACHE_REDIS_PORT":6379,
	# redis 数据库索引
	"CACHE_REDIS_DB":3,
	# redis 密码
	"CACHE_REDIS_PASSWORD":'',
}

app = Flask(__name__)
app.config["SECRECY_KEY"] = "abcdef"
#程序实例对象 加载缓存配置信息
app.config.from_object(cache_config)
app.register_blueprint(blue)
c.init_app(app,cache_config)   # 关联程序实例与缓存对象

c = Cache()
@blue.route("/cache/")
@c.cached(timeout=30,key_prefix="前缀")
def cache_view():
	return "视图函数返回的结果"
示例代码:
# manager.py
from cache_app import create_app
from flask_script import Manager
app = creat_app()
manaegr = Manager(app)
if __name__ == "__main__":
	manager.run()

# __init__.py
from cache_app.views import c,blue
cache_config = {
	'CACHE_TYPE':'redis',
	'CACHE_REDIS_HOST':'lcoalhost',
	'CACHE_REDIS_PORT':6379,
	'CACHE_REDIS_DB':3,
	'CACHE_REDIS_PASSWORD':123
}
def create_app():
	app = Flask(__name__)
	# 加载配置信息
	app.config.from_object(cache_config)
	# 缓存对象关联Flask 程序实例,配置信息也要关联缓存对象
	c.init_app(app,cache_config)
	app.register_blueprint(blue)
	return app
# views.py
from flask import Blueprint
from flask_cache import Cache
blue = Blueprint("myblue",__name__)
c = Cache()

@blue.route("/cache/")
@c.cached(timeout=30,key_prefix="python")
def my_view():
	print("模拟耗时操作......")
	time.sleep(3)
	return "<h3 style='color:green'>恭喜,你成功了!!!</h3>"

2. 请求钩子

Flask 的请求钩子是通过装饰器的形式实现。
2.1 brefore_first_request
注册一个函数,在处理第一个请求之前运行
2.2 before_request
注册一个函数,在每次请求之前运行
2.3 after_request
正常请求(没有发生异常,或异常被处理了)之后执行
被装饰的请求钩子函数接收一个响应对象的参数,最终一定要返回该响应对象
2.4 teardown_request
注册一个函数(该函数接收一个异常对象的参数),即使有未处理的异常抛出,也在每
次请求之后运行(关闭调试模式)
2.5 使用技巧
在请求钩子函数和视图函数之间共享数据一般使用上下文全局变量g
例如:before_request处理程序可以从数据中加载已登录用户,并将其保存到g.user
		中。随后调用视图函数时,视图函数再使用g.user获取用户
	
示例代码:
# manager.py
from gou_app import create_app
from flask_script import Manager
app = create_app()
manager = Manager(app)

if __name__ == "__main__":
	manager.run()
	
# __init__.py
from gou_app.middleware import load_middleware
from gou_app.views import blue

def create_app():
	app = Flask(__name__)
	load_middleware(app)
	app.register_blueprint(blue)
	return app

# middleware.py
import random
from flask import request,g

def load_middleware(app):

	#第一次接收到请求,自动执行
	@app.before_first_request
	def a():
		print("第一次请求 before_first_request......")
	
	# 每次接收到请求,自动执行该装饰器的函数
	@app.before_request
	def b():
		ip = request.remote_addr # 获取当前发送请求的客户端的IP
		print(ip + "发送了请求,before_request")
		number = random.randint(1,10) # 随机生成1 到 10(包括) 的整数
		if number >= 8:
			g.book = "<<九阴真经>>"
			return "<h3 style='color:green'>恭喜,已中奖,您的IP是:" + ip +": 获取的随机数是:" + str(number)+ "</h3>"
		g.book = "<<九阳真经>>"
	
	# 请求后 (未发生异常,或异常被捕获)执行
	@app.after_request
	def c(response):
		# 尝试从当前请求 全局对象中获取book 属性值
		data = g.book
		print("after_request......,g.book=",data)
		return response # 一定要将响应对象返回

	@app.teardown_requet
	def d():
		print("treardown_request......,e=",e)

# views.py
from flask import Blueprint,g
blue = Blueprint("myblue",__name__)

@blue.route("/index/")
def index_view():
	data = g.book # 获取全局对象中的 book 属性值
	try:
		5 / 0
	except:
		print("异常已经被处理......")
	return "<h3>拿到武林绝学了:<span style='color:red'>" + data + "</span></h3>" 

3. 四大内置对象(request,session,g,config)

	1. request
	2. .session
	3. g: 一个请求中的全局对象,只要在同一个请求内,都可以通过g对象传递数据
	4. config:
		针对程序实例的配置。
		在模板中直接使用config内置对象
		在函数中通过current_app.config访问config 对象
		遍历config 内容:
				for k,v in config对象.items():
					print(k,"========>",v)
示例代码:
# manager.py
from inner_obj_app import create_app
from flask_script import Manager
app = create_app()
manager = Manager()

if __name__ == "__main__":
	manager.run()

# __init__.py
from flask import Flask
from inner_obj_app.views import blue

def create_app():
	app = Flask(__name__)
	app.register_blueprint(blue)
	app.config["country"] = "China"
	app.config["color"] = "RED"
	app.config["food"] = "Noodles"
	return app

# views.py
from flask import Blueprint,render_template,current_app

@blue.route("/go/")	
def go_config():
	return render_template("config_demo.html")

@blue.route("/show/")
def show_config_view():
	html = ""
	# 在程序中要通过current_app.config 获取配置对象
	for k,v in current_app.config.items():
		html += k
		html += "------>"
		html += str(v)
		html += "<br/>"
	return html
config_demo.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模板中演示config内置对象</title>
</head>
<body>
    {% for k,v in config.items() %}
         {{ k }} =========> {{ v }}  <br/>
    {% endfor %}
    
</body>
</html>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值