讲师中心 微信公众号
AI工具推荐 视频效率加速

在Python Flask中如何利用Flask-Caching实现页面级缓存?

风宇酱_5122

风宇酱_5122

发布时间:2026-08-15 11:41:21

|

227人浏览过

|

来源于php中文网

原创

页面级缓存该用@cache.cached,因其默认基于request.path和query_string生成缓存键,适配HTTP请求上下文;@cache.memoize仅依据函数参数缓存,不感知URL、headers等,易导致多用户或不同参数请求命中同一缓存,造成内容错乱。

在python flask中如何利用flask-caching实现页面级缓存?

页面级缓存该用 @cache.cached 还是 @cache.memoize?

@cache.cached 是页面级缓存的正确选择,@cache.memoize 用于函数级结果缓存(比如数据库查询),它不感知 HTTP 请求上下文,无法区分不同 URL 参数或用户请求。页面缓存必须基于请求路径、查询参数、甚至 headers(如 Accept-Language)生成唯一 key,@cache.cached 默认就做这件事。

常见错误是直接套用 @cache.memoize 装饰视图函数,结果所有用户看到同一份缓存内容,或者带参数的 GET 请求(如 /user?id=123 和 /user?id=456)命中同一个缓存项——因为 memoize 只看函数参数,而 Flask 视图函数通常不显式接收 query string 参数。

  • @cache.cached(timeout=300) 会自动提取 request.path + request.query_string 作为 key 基础
  • 若需按用户身份缓存(如登录态不同显示不同内容),得手动加 key_prefix,例如 key_prefix=lambda: f"user_{session.get('user_id') or 'anon'}"
  • 避免在 POST/PUT 视图上误用 @cache.cached——它默认对所有 HTTP 方法生效,但页面缓存只应作用于安全的 GET/HEAD 请求

如何让缓存键包含请求头(比如 Accept 或 User-Agent)?

默认缓存 key 不包含 headers,所以返回 JSON 的 Accept: application/json 和返回 HTML 的同一路由会共用缓存,导致格式错乱。解决方法是扩展 make_cache_key 函数,或使用 unless + 自定义 key 逻辑。

更稳妥的做法是重写 key_prefix,把它变成一个 callable,并在其中拼接关键 header:

立即学习“Python免费学习笔记(深入)”;

testing-python
testing-python

使用pytest编写和评估有效的Python测试。适用于编写测试、审查测试代码、调试测试失败或提高测试覆盖率。

下载
@app.route('/api/data')
@cache.cached(
    timeout=60,
    key_prefix=lambda: f"api_data_{request.headers.get('Accept', '').replace('/', '_')}_{hash(request.args.to_dict())}"
)
def api_data():
    return jsonify({'data': get_expensive_result()})
  • 注意:不要无差别包含所有 headers,X-Forwarded-For、Cookie 等动态值会导致 key 爆炸、缓存失效
  • hash(request.args.to_dict()) 比直接用 str(request.args) 更稳定(避免排序差异)
  • 如果用了 Nginx 或 CDN,确认它没擅自改写或剥离关键 headers,否则 Flask 拿不到真实值

缓存失效怎么触发?手动清除指定页面缓存有哪些方式?

Flask-Caching 本身不提供“按 URL 失效”接口,它的 cache.delete() 需要精确知道缓存 key。而 @cache.cached 生成的 key 是内部拼接的,直接猜容易出错。

推荐做法是在装饰器中显式指定可预测的 key_prefix,这样清除时就能反向构造 key:

@app.route('/blog/<int:post_id>')
@cache.cached(key_prefix='blog_post_')
def show_post(post_id):
    return render_template('post.html', post=get_post(post_id))
<h1>失效时:</h1><p>cache.delete('blog<em>post</em>' + str(post_id))
  • 不要依赖默认 key(如 view//blog/123),它可能随 Flask 版本或配置变化
  • 涉及多个参数的场景(如分页 + 排序),把参数组合进 key_prefix 字符串,例如 f"list_page_{page}_{sort}"
  • 全局清空用 cache.clear(),但生产环境慎用——它会清掉所有缓存,包括非页面类数据(如 @cache.memoize 结果)

为什么本地开发用 SimpleCache 总是不生效?

SimpleCache 是内存型后端,每个 worker 进程独享一份缓存,Flask 开发服务器默认多进程(threaded=False)时,各请求落在不同进程,彼此看不到对方的缓存。现象是:刷新一次有缓存,再刷新又重新计算。

  • 开发时设 threaded=True(默认已开启)+ processes=1,确保单进程运行
  • 或换用 RedisCache / FileSystemCache,它们跨进程共享
  • 验证是否生效:在视图里加 print("CALCULATING..."),连续刷新两次没输出,说明缓存命中
  • 别在生产用 SimpleCache,它不支持过期、不支持并发清理,只适合 demo 或单元测试

页面级缓存真正难的不是配置,而是判断哪些页面值得缓存、哪些请求头该纳入 key、以及失效时机是否和业务更新节奏对齐——比如一篇博客修改后,不仅要删自己那条缓存,还可能要连带清掉相关列表页。这些没法靠插件自动完成。

热门AI工具

更多
Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1671

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

4224

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1669

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

24477

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2987

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3027

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1163

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

596

2023.08.10

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

40

2026.10.08

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn