Flask-cache缓存-请求钩子

文章目录

      • 1.flask-cache 缓存插件
      • 2. 请求钩子
        • 2.1 brefore_first_request
        • 2.2 before_request
        • 2.3 after_request
        • 2.4 teardown_request
        • 2.5 使用技巧
      • 3. 四大内置对象(request,session,g,config)

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 "

恭喜,你成功了!!!

"

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 "

恭喜,已中奖,您的IP是:" + ip +": 获取的随机数是:" + str(number)+ "

"
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 "

拿到武林绝学了:" + data + "

"

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 += "
"
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>

你可能感兴趣的:(flask框架,flask,缓存,python)