• Flask框架——flask-caching缓存


    目录

    安装flask-caching

    缓存类型

    初始化

    使用缓存

    缓存视图函数

    其他函数

    缓存对象(键值对)


    上篇文章我们学习了Flask框架——Session与Cookie,这篇文章我们来学习Flask框架——flask-caching缓存。

    我们访问网页时,一般都需要加载网页中的很多数据资源,例如我们访问京东或淘宝首页,如下图所示:

    每次访问都需要加载上面的数据资源,假如每次都是从web服务器中加载这些数据资源,而这些数据资源比较大的话,服务器可能响应这些资源需要比较久的时间,那么我们在短时间内访问这些网页时,访问效率会很低,用户体验会很差。

    为了提高web应用访问效率,减少web服务器的响应时间,我们可以在需要经常访问的网页或某个数据模块中添加缓存,在一定时间内直接在缓存中获取数据资源而不是每次都要在web服务器中获取数据资源。

    安装flask-caching

    Redis是一个基于内存的、高效的键值型非关系型数据库,存取效率极高,而且支持多种数据存储结构,使用起来也非常简单。所以我们使用Redis非关系型数据库作为我们缓存数据的存放位置。执行如下代码安装Redis和flask-caching:

    1. pip install flask-caching
    2. pip install redis

    注意:除了通过pip install redis安装redis,还需要在根据运行环境在windows和服务器中安装Redis在路径中找到:redis-cli.exe文件并双击该文件启动redis服务。

    缓存类型

    我们来了解一下flask-caching支持的缓存类型:

    flask-caching内置的缓存类型CACHE_TYPE有:NullCache、SimpleCache、FileSystemCache、RedisCache、RedisSentinelCache、RedisClusterCache、UWSGICache、MemcachedCache、SASLMemcachedCache和SpreadSASLMemcachedCache(在Flask-Caching2.0中删除)。

    其中:

    NullCache:无缓存,其配置参数可以有:

    • CACHE_NO_NULL_WARNING:不会抛出警告信息;

    • CACHE_DEFAULT_TIMEOUT:如果未指定超时,则使用默认超时,时间单位是秒。

    SimpleCache:使用本地python字典进行存储,非线程安全,其配置参数可以有:

    • CACHE_DEFAULT_TIMEOUT:如果未指定超时,则使用默认超时,时间单位是秒;

    • CACHE_THRESHOLD:最大缓存数;

    • CACHE_IGNORE_ERRORS:其值为True时,在删除过程中发生的任何错误将被忽略;其值为False时,在删除过程中第一个错误时停止删除;

    FileSystemCache:使用文件系统来存储缓存的值,其配置参数可以有:

    • CACHE_DEFAULT_TIMEOUT:如果未指定超时,则使用默认超时,时间单位是秒;

    • CACHE_IGNORE_ERRORS:其值为True时,在删除过程中发生的任何错误将被忽略;其值为False时,在删除过程中第一个错误时停止删除;

    • CACHE_DIR:存储缓存的目录;

    • CACHE_THRESHOLD:最大缓存数;

    • CACHE_OPTIONS:在缓存类实例化期间传递的可选字典。

    RedisCache:使用Redis作为缓存后端,其配置参数可以有:

    • CACHE_DEFAULT_TIMEOUT:如果未指定超时,则使用默认超时,时间单位是秒;

    • CACHE_KEY_PREFIX:所有它都可以用于应用程序的应用程序使用相同的键;

    • CACHE_OPTIONS:在缓存类实例化期间传递的可选字典;

    • CACHE_REDIS_HOST:Redis 服务器主机;

    • CACHE_REDIS_PORT:Redis 服务器端口,默认为 6379;

    • CACHE_REDIS_PASSWORD:服务器的 Redis 密码;

    • CACHE_REDIS_DB :Redis db(从零开始的数字索引),默认为 0;

    • CACHE_REDIS_URL:| 连接到 Redis 服务器的 URL,例子redis://user:password@localhost:6379/2 。

    RedisSentinelCache:使用Redis哨兵模型缓存,其配置参数可以有:

    • CACHE_KEY_PREFIX:所有它都可以用于应用程序的应用程序使用相同的键;

    • CACHE_REDIS_SENTINELS:Redis哨兵地址的列表或元组;

    • CACHE_REDIS_SENTINEL_MASTER:哨兵配置中的主服务器的名称

    • CACHE_REDIS_PASSWORD:服务器的 Redis 密码;

    • CACHE_REDIS_DB:Redis db(从零开始的数字索引),默认为 0。

    RedisClusterCache:使用Redis自动分区缓存,其配置参数可以有:

    • CACHE_KEY_PREFIX:所有它都可以用于应用程序的应用程序使用相同的键;

    • CACHE_REDIS_CLUSTER:一串以逗号分隔的 Redis 集群节点地址;

    • CACHE_REDIS_PASSWORD:服务器的 Redis 密码。

    MemcachedCache:使用memcached服务器作为缓存后端,支持pylibmc或memcache或Google应用程序引擎memcache库,其配置参数可以有:

    • CACHE_DEFAULT_TIMEOUT:如果未指定超时,则使用默认超时,时间单位是秒;

    • CACHE_KEY_PREFIX:所有它都可以用于应用程序的应用程序使用相同的键;

    • CACHE_MEMCACHED_SERVERS:服务器地址的列表或元组。

    注意:Flask-Caching不会将额外的配置选项传递给memcached后端,要向这些缓存添加其他配置。

    SASLMemcachedCache:启用SASL的memcached服务器作为缓存后端,其配置参数可以有:

    • CACHE_DEFAULT_TIMEOUT:如果未指定超时,则使用默认超时,时间单位是秒;

    • CACHE_KEY_PREFIX:所有它都可以用于应用程序的应用程序使用相同的键;

    • CACHE_OPTIONS:在缓存类实例化期间传递的可选字典;

    • CACHE_MEMCACHED_SERVERS:服务器地址的列表或元组;

    • CACHE_MEMCACHED_USERNAME:使用memcached进行SASL身份验证的用户名;

    • CACHE_MEMCACHED_PASSWORD:使用memcached进行SASL身份验证的密码。

    UWSGICache:使用uwsgi服务器作为缓存,其配置参数可以有:

    • CACHE_UWSGI_NAME:要连接的uwsgi缓存实例的名称,例如:mycache @ localhost :3031,默认为空字符串;

    注意:该UWSGICache没有维护也没有测试,不建议使用。

    初始化

    这里我们的缓存类型为RedisCache:

    1. from flask import Flask
    2. from flask_caching import Cache
    3. #配置RedisCache缓存类型参数值,我们使用本地的redis,没有密码
    4. config={     
    5.     'CACHE_TYPE':'redis',  #使用redis作为缓存
    6.     'CACHE_REDIS_HOST':'127.0.0.1',  #redis地址
    7.     'CACHE_REDIS_PORT':6379  #redis端口号
    8. }
    9. app = Flask(__name__)
    10. #初始化缓存
    11. cache=Cache(app=app,config=config)  #创建Cache对象
    12. #或使用init_app()初始化缓存
    13. #cache=Cache()         #创建Cache对象
    14. #cache.init_app(app=app,config=config)
    15. @app.route('/')
    16. def hello_world():
    17.     return 'Hello World!'
    18. if __name__ == '__main__':
    19.     app.run()

    我们可以根据需要可以将CACHE_REDIS_HOST换为服务器的地址。

    Cache对象的主要方法有:

    1. #装饰器,装饰无参数函数,缓存该函数
    2. @cache.cached(timeout=None,key_prefix=None,unless=None,forced_update=None,query_string=False)

    timeout为超时时间;

    可选参数有:

    • key_prefix:缓存指定的函数;

    • unless:是否启用缓存,如果为True,不启用缓存;

    • forced_update:缓存是否实时更新,如果为True,无论是否过期都将更新缓存;

    • query_string:为True时,缓存键是先将参数排序然后哈希的结果。

    1. #装饰器,装饰有参数函数,缓存该函数
    2. @cache.memoize(timeout=None,make_name=None,unless=None,forced_update=None,query_string=False)

    与cache.cached()方法类似,区别为cache.memoize有make_name,其作用是设置函数的标志,如果没有就使用装饰的函数。

    使用缓存

    我们可以使用缓存缓存视图函数、其他函数、对象(键值对)。

    缓存视图函数

    视图函数代码如下所示:

    1. @app.route('/view')
    2. @cache.cached(timeout=30)  #设置超时时间
    3. def view():
    4.     time.sleep(2)       #模拟数据加载时间
    5.     return '视图函数缓存'

    为了能更好地体现效果,我们通过设置休眠时间来模拟数据加载时间,启动Flask项目,浏览器访问http://127.0.0.1:5000/view,可以发现网页需要过了两秒才显示内容,在30秒内,我们再次访问该网页就会秒显示内容,过了30秒后,再次访问网页,又需要过两秒才显示内容。

    其他函数

    在缓存其他函数时,需要使用关键字key_prefix指定缓存哪个函数。代码如下所示:

    1. @cache.cached(timeout=50, key_prefix='get_list')
    2. def timesleep():
    3.     time.sleep(2)
    4.     return '缓存其他无参函数'
    5. @app.route('/others')
    6. def others():
    7.     return timesleep()

    启动flask项目后,访问http://127.0.0.1:5000/others结果和刚才演示缓存视图函数一样。

    缓存对象(键值对)

    在缓存对象中,我们可以使用以下代码来设置、获取、删除缓存对象:

    1. #设置
    2. cache.set(key,value,timeout=None#设置一个缓存对象
    3. cache.set_many([(key,value),(key,value),...,(key,value)],timeout=None#设置多个缓存对象
    4. #获取
    5. cache.get(key)        #获取一个缓存对象
    6. cache.get_many(key1,key2,....)  #获取多个缓存对象
    7. #删除
    8. cache.get.delete(key)      #删除一个缓存对象
    9. cache_delete_many(key1,key2,...) #删除多个缓存对象
    10. cache.clear()     #删除所有缓存对象

    为了方便演示,我们简单地操作缓存对象:

    1. @app.route('/object')
    2. def object():
    3.     cache.set('name''小明', timeout=30)  #设置键为name,value为小明,超时时间为30秒的缓存对象
    4.     print(cache.get('name'))    #打印键为name的缓存对象值
    5.     cache.set_many([('name1''小明'), ('name2''老王')],timeout=30#设置多个缓存对象
    6.     print(cache.get_many("name1""name2"))  #打印多个缓存对象值
    7.     print(cache.delete("name"))    #删除键为name的缓存对象
    8.     print(cache.delete_many("name1""name2")) #删除多个缓存对象
    9.     return '缓存对象'

    启动flask项目,访问http://127.0.0.1:5000/object,在pycharm中终端,如下图所示:

    在web项目中,最常用到缓存对象的是短信验证码的有效时间。

    好了,关于Flask框架——flask-caching缓存就讲到这里了,感谢观看,下篇文章我们学习Flask框架——消息闪现

    公众号:白巧克力LIN

    该公众号发布Python、数据库、Linux、Flask、自动化测试、Git等相关文章!

    - END -

  • 相关阅读:
    SQL SELECT INTO 语句
    Codeforces Round #909 (Div. 3)
    SpringCloudAlibaba的nacos控制台不断输出日志
    Nodejs之egg基本使用(egg服务、egg-mysql、CSRF漏洞、egg-jwt、Swagger)
    【obs】x264编码:“buffer_size“
    vue3.0+echarts, 图正常渲染, 但tooltip不显示
    一道北大强基题背后的故事(三)——什么样的题是好题?
    Python 的基本数据类型
    鲸选小试界的市场野心要解决85%商家的痛点?
    YOLO算法(You Only Look Once)系列讲解与实现(待完善)
  • 原文地址:https://blog.csdn.net/weixin_52122271/article/details/125902849