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)
本文作者:littlecc
本文链接:https://www.cnblogs.com/littlecc/p/18328137
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步