18、flask-进阶-插件-缓存flask-caching - 钩子函数(中间件)
1.认识flask-caching插件
使用插件
1.安装
$ flask install flask-caching
2.初始化
在exts.py
中导入并初始化
from flask_caching import Cache
#初始化插件
cache = Cache(config={
'CACHE_TYPE': 'simple' # 缓存类型
})
#和app对象绑定
def init_exts(app):
cache.init_app(app)
3.在视图函数中使用
views.py
import time
from flask import Blueprint
from .models import *
from .exts import cache #导入
#创建蓝图(路由)
blue = Blueprint('user', __name__)
# 使用缓存cache
@blue.route('/')
# 给视图函数加缓存 20s,在第一次访问这个路由函数的时候,会调用视图函数,然后把返回值缓存起来,
#以后再访问这个路由函数的时候,直接从缓存中取值,不用再调用视图函数了
@cache.cached(timeout=20)
def index():
print('Index')
#第一次访问时会加载5秒才会输出 index、第二次访问后就不需要加载5s,直接输出 index,过了 20s 后才会继续加载5s
time.sleep(5)
return 'index'
2.钩子
- 什么是钩子(中间件Middleware)
钩子或叫钩子函数、是指在执行函数和目标函数之间挂载的函数、框架开发者给调用方提供一个point-挂载点、是一种AOP切面编程的思想
- 常用的钩子函数:
- before_first_request: 处理第一次请求之前执行
- before_request:在每次请求之前执行、通常使用这个钩子函数处理一些变量、实现反爬
- after_request:注册一个函数,如果没有未处理的异常抛出、在每次请求之后运行
- teardown_appcontext:当APP上下文被移除之后执行的函数、可以进行数据库的提交或者回滚
- 以下是案例,使用爬虫与反爬机制说明
views.py
import time
from flask import Blueprint, request
from .models import *
from .exts import cache #导入
#创建蓝图(路由)
blue = Blueprint('user', __name__)
# 使用缓存cache
@blue.route('/')
# 给视图函数加缓存 20s,在第一次访问这个路由函数的时候,会调用视图函数,
# 然后把返回值缓存起来,以后再访问这个路由函数的时候,直接从缓存中取值,不用再调用视图函数了
@cache.cached(timeout=20)
def index():
print('Index')
time.sleep(5)
return 'index'
# 钩子函数的使用 - 中间件
# before_request:每一次请求其他路由前都会先执行该函数
@blue.before_request
def before():
print('before_request')
# request对象
print(request.path) # 访问的路由
print(request.method) # 请求的方法
print(request.remote_addr) # 客户端的ip地址
# 实现反爬机制
# 如果是python脚本请求就会返回类似:python-requests/2.32.3 的user_agent
# 如果是正常的浏览器请求就会返回类似:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 的user_agent
print(request.user_agent) # 客户端的user_agent
if "python" in request.user_agent.string:
#进行拦截,如果是爬虫,就返回一个提示,不再进入视图函数
return '你在使用爬虫,反爬机制,再见'
# 针对ip做反爬机制
ip = request.remote_addr
#cache.get() # 获取缓存
#cache.set() # 设置缓存
if cache.get(ip):
return '你访问的太频繁,请稍后再试'
else:
# 对每个ip设置一个缓存、一秒内不让重复访问
cache.set(ip, 'value', timeout=1)
spider爬虫
用来模仿爬虫
import requests
# # 简单请求
# res = requests.get('http://127.0.0.1:5000/')
# print(res.text)
# 模仿爬虫重复请求多次
for i in range(10):
res = requests.get('http://127.0.0.1:5000/')
print(res.text)