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 timefrom 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 timefrom 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_agentprint(request.user_agent) # 客户端的user_agentif "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)