首页 > 其他分享 >18、flask-进阶-插件-缓存flask-caching - 钩子函数(中间件)

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

时间:2024-07-28 13:39:47浏览次数:14  
标签:插件 缓存 函数 flask 中间件 cache request import

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

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

标签:插件,缓存,函数,flask,中间件,cache,request,import
From: https://www.cnblogs.com/littlecc/p/18328137

相关文章

  • 如何在 FastAPI 中间件中以不同方式捕获或处理 RequestValidationError 异常?
    如何正确组合RequestValidationError异常处理程序,如:@app.exception_handler(RequestValidationError)asyncdefvalidation_exception_handler(request,exc):response=prepare_response({},g_ERROR__INCORRECT_PARAMS)returnJSONResponse(content=re......
  • 如何在flask和jinjia2模板中仅显示一个登录或注销按钮?
    我想在用户登录时显示注销按钮,在用户注销时显示登录按钮。但是这些按钮显示的次数与我有用户的次数一样多。我该如何修复它?--htmlcode{%foruserinusers%}{%ifuser.user_id==session['user_id']%}<liclass="nav-item">......
  • 【Unity插件】Editor Console Pro:提升开发效率的神器
    在Unity开发过程中,控制台(Console)是我们排查错误、获取信息的重要窗口。而EditorConsolePro则是Unity编辑器控制台的强大替代品,为Unity的控制台带来了更多实用的功能和改进,极大地提升了开发效率。一、EditorConsolePro简介EditorConsolePro是一款在Unity......
  • 基于python+flask+mysql徐州市天气信息可视化分析系统04600-计算机毕业设计项目选题推
    摘 要信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对天气信息等问题,对天气信息进行研究分析,然后开发设计出天气信息可视化分析系统以解决问题。......
  • 1 个 html 文件中有 2 个表单会引发错误:400 Bad Request (flask)
    我最近开始学习Flask,遇到了一个问题,当1个html文件有2个可以提交的表单时会发生这种情况。当只有一种表单时,不会发生此问题。这是我包含flask的python文件:fromflaskimportFlask,request,render_templateapp=Flask(__name__)app.secret_key='secretkry'......
  • python+flask计算机毕业设计农场营销管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着现代农业的快速发展,农场管理日益复杂,尤其是营销环节,传统的销售模式已难以满足市场快速变化的需求。农场主面临着如何高效管理农资采购......
  • python+flask计算机毕业设计社区独居老人健康管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着社会老龄化的加速,独居老人群体日益庞大,成为社会关注的焦点。这一群体在享受独立生活的同时,也面临着健康监测不及时、生活照料缺失、医......
  • 16、flask-模型-models-表的操作-多表操作-多对多
    代码如下:变化的只有models.py和views.pymodels.py"""用户:电影=N:M"""#中间表:收藏电影的用户collect=db.Table('collects',db.Column('user_id',db.Integer,db.ForeignKey('usermodel.id'),prima......
  • 15、flask-模型-models-表的操作-多表操作-一对多
    这里选择学生表和班级表作为案例app.pyfromAppimportcreate_appapp=create_app()if__name__=='__main__':app.run(debug=True)#运行:flaskrun--debugviews.pyimportrandomfromflaskimportBlueprint,request,render_templatefrom.modelsimpo......
  • 15、flask-模型-models-表的操作-分页paginate()
    paginate()的属性属性名说明items返回当前页的内容列表has_next是否还有下一页has_prev是否还有上一页next(error_out=False)返回下一页的pagination对象prev(error_out=False)返回上一页的Pagination对象page当前页的页码pages总页数per_p......