• 【flask】根据接口名称和请求参数进行缓存


    写于2022.9.16
    参考:https://blog.csdn.net/huang_yong_peng/article/details/82622077?spm=1001.2014.3001.5506

    flask进行缓存有两种方案:

    • 基于werkzeug自定义缓存装饰器

    • 基于flask-cache(推荐)

      pip install flask-cache

    基于flask-cache给出一个缓存示例

    想基于缓存机制实现的效果是:

    查询场景类似于传递名字来查询某个人的信息,想要缓存每次的查询记录和结果,当出现相同查询同一个人的信息时,直接调用缓存结果,

    比如缓存一堆用户名和对应的查询信息。

    此时有两个方案:

    方案一:基于flask-cache的memoize

    from flask import Flask
    from flask_cache import Cache
    
    app = Flask(__name__)
    cache = Cache(app, config={'CACHE_TYPE': 'simple'})
    
    @app.route('/user/')
    @cache.memoized(timeout=300)
    def hello(name):
        print(name)
        return "该name对应的信息"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    此时接口访问形式为:

    /user/tom, tom为传递的用户名

    此时缓存项的键是**/user/tom**

    此方案的缺点在于,只能传递一个参数,想要传递多个参数怎么办,用方案二。

    方案二:基于flask-cache的cached(推荐)

    参考:https://www.cnblogs.com/Jacob-yang/p/15905907.html

    from flask import Flask
    from flask_cache import Cache
    
    app = Flask(__name__)
    cache = Cache(app, config={'CACHE_TYPE': 'simple'})
    
    # 获取url作为缓存项键值
    def key_prefix_func():
        with app.app_context():
            cache_key = request.url
        return cache_key
    
    @app.route('/user')
    @cache.cached(timeout=300, key_prefix=key_prefix_func)
    def hello():
        name = request.args.get("name")
        print(name)
        return "该name对应的信息"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    此时接口访问形式为:

    /user?name=tom, tom为传递的用户名

    此时缓存项的键是**/user?name=tom**

    这种方案的好处在于不限制参数数量。

    使用flask-cache遇到的问题及解决办法汇总(本人遇到且采用):

    Q1:ImportError: cannot import name ‘import_string‘ from ‘werkzeug‘

    解决办法:https://blog.csdn.net/qf895811239/article/details/125861897

    Q2:No module named flask.ext

    解决办法:https://blog.csdn.net/weixin_41790086/article/details/106622676

    Q3:ModuleNotFoundError: No module named ‘werkzeug.contrib‘

    解决办法:https://blog.csdn.net/hegongda9/article/details/120593910

    总结如下:
    使用缓存机制,
    1.需要安装flask_cache、cachelib
    2.需要更改falsk_cache源码(避免报上面的错),找到flask-cache的安装路径:
    (1)init.py
    将:from werkzeug import import_string
    改为:from werkzeug.utils import import_string

    (2)jinjia2ext.py
    将:from flask.ext.cache import make_template_fragment_key
    改为:from flask_cache import make_template_fragment_key

    (3)backends.py
    将 from werkzeug.contrib.cache import (BaseCache, NullCache, SimpleCache, MemcachedCache,
    GAEMemcachedCache, FileSystemCache)
    改为:
    from cachelib import (BaseCache, NullCache, SimpleCache, MemcachedCache,
    FileSystemCache)

  • 相关阅读:
    Elasticsearch未授权访问漏洞(Es未授权访问)
    采用普罗米修斯(Prometheus )监控各个指标的含义,类型,以及格式
    PHP M题 20221104
    深度神经网络和人工神经网络区别
    MATLAB算法实战应用案例精讲-【推荐系统】CTR预估模型(补充篇)
    计算机毕业设计(附源码)python中国朝鲜族民族特色服务系统
    TASK03|GitModel 假设检验3|分类数据检验
    ArrayList和CopyOnWriteArrayList
    基于深度学习的车辆检测技术
    2022.9.8-----leetcode.667
  • 原文地址:https://blog.csdn.net/xiangxiang613/article/details/126898919