18、flask-进阶-插件-缓存flask-caching - 钩子函数(中间件)

news/2024/11/16 5:57:54/文章来源:https://www.cnblogs.com/littlecc/p/18328137

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切面编程的思想

  • 常用的钩子函数:
  1. before_first_request: 处理第一次请求之前执行
  2. before_request:在每次请求之前执行、通常使用这个钩子函数处理一些变量、实现反爬
  3. after_request:注册一个函数,如果没有未处理的异常抛出、在每次请求之后运行
  4. 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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/773000.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 中的集合

Java 中的集合分类,ArrayList、HashMap 的源码和底层数据结构分析。Author: ACatSmiling Since: 2024-07-28概述 在 Java 语言中,数组(Array)和集合都是对多个数据进行存储操作的结构,简称Java 容器。此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储。 数组在…

log工具类

package com.atheima.controller.utils;import org.slf4j.Logger; import org.slf4j.LoggerFactory;public class BaseLog {private Class clazz = null;public static Logger log;public BaseLog(){clazz = this.getClass();log = LoggerFactory.getLogger(clazz);}//第二中实…

周期信号的傅里叶级数和频谱

傅里叶级数和信号频谱 对于一个确定的时域信号,我们只需要知道它的函数表达式就可以在任意时刻确定一个信号,但是各种场景下中我们需要的往往并不是这样的解析式,因为这些复杂的式子首先难以快速准确地获得,另外难以进行快速进行分析,其中所蕴含的信息也难以提取。因此需要…

mysqld: Table '.mac_vod' is marked as crashed and should be repaired

mysqld: Table '.mac_vod' is marked as crashed and should be repaired 这类问题大多是重启服务器后导致的故障, 一般可以理解为表损坏。 解决方法其实也简单, 通过数据库管理工具,进行表修复就可以。 REPAIR TABLE mac_vod 这里的mac_vod 替换成自己的数据表名称。…

【WPF】Command 的一些使用方案

Command,即命令,具体而言,指的是实现了 ICommand 接口的对象。此接口要求实现者包含这些成员: 1、CanExecute 方法:确定该命令是否可以执行,若可,返回 true;若不可,返回 false; 2、CanExecuteChanged 事件:发送命令(命令源)的控件可以订阅此事件,当命令的可执行性…

leetcode-7

题目: 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。 推导:代码:class Solution { public:int reverse(int x) {int res = 0;while (x != 0) {int tmp = x % 10;if (re…

QOJ5090 妙妙题

将白色看作 \(0\),黑色看作 \(1\),并将所有人等距离排在圆上,若知道所有人颜色的异或和,就可以根据自己看见的颜色集合判断自己的颜色,且将圆等切为两半一定有少的一边的人数 \(\ge \lfloor \frac{n-1}{2} \rfloor\),但若圆两边的黑点关于切线翻转对称(如下图),则会出…

Vulfocus靶场搭建以及镜像管理界面没有镜像可以拉取的解决办法

Vulfocus靶场搭建 1.拉取vulfocue镜像 docker pull vulfocus/vulfocus:latest拉取成功2.开启靶场 首先使用ifconfig查看一下虚拟机的IP,发现为x.x.x.x 然后使用物理机去ping一下这个IP地址看看是否能ping通 若能ping通则继续下面的操作 生成docker容器 docker create -p 80:80…

BUUCTF 5.level0

很简单的一道栈溢出的题(不知道为啥解题人数却比前几个少) 直接开干:看不出啥来保护只开了NX,我们看一下IDA很明了的一道题,直接秒 exp:flag:

mysql 关于幻读

前言 什么是幻读?幻读这个概念产生是因为事物隔离级别可重复读需要解决的一个问题。 可重复读,顾名思义,就是一个事物中多次读取的结果是一致的。 那其中就包含两个需要解决的问题:虚读: 对同一行数据,每次读取的不一致。具体表现为T1读取某一数据后,当T2进行了修改,然后…

冻鳗蔓延设在MC游玩上的一些解决方案(以当期Modpacks Infinte Infinity为例,并拓展)

本文介绍了基于OPL联机工具和PCL2的LittleSkin登录来实现MC联机的操作方法文章组成 一、前言 二、游玩须知 三、Mod 解决方案 四、联机解决方案 五、拓展 一、前言 关于MC一时起兴,然后大部分人不知道怎么搞我们正在玩的模组,所以写这样一则博客来记录本期 MC 游玩的一些技术…

BUUCTF 5.pwn1_sctf_2016

拿到题目首先先运行。我们发现他是将我们输入的重新输出出来,但是第二次运行时,我输入超长字符串后,仅仅只是输出了一部分,所以我们可以猜测程序中应该有检测长度的部分,我们再检查一下保护机制。我们发现仅仅只是开了一个nx保护,那么我们直接看IDA我们发现主函数中仅仅只…