You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask项目页面打开报错:使用get_cache触发KeyError问题求助

解决Flask-Caching引发的KeyError问题

这个KeyError: <flask_caching.Cache object at ...>错误很明确——你的Flask-Caching实例没有和Flask应用完成正确的绑定,导致在视图中调用缓存方法时,扩展找不到对应的应用关联实例。

核心原因

Flask-Caching的Cache对象需要通过初始化步骤与Flask应用绑定,它会把自身实例存储在app.extensions["cache"]字典中。当你调用cache.get()或cache.set()时,扩展会尝试从这个字典里查找对应的实例,如果没找到就会抛出这个KeyError。

解决方案步骤

1. 确保Cache在App中正确初始化

首先检查你的app/__init__.py文件,确认缓存的初始化代码符合以下两种方式之一:

直接初始化(适用于非工厂模式):

from flask import Flask
from flask_caching import Cache

app = Flask(__name__)

# 配置缓存(这里用内存缓存做示例,生产环境可替换为Redis/Memcached)
app.config['CACHE_TYPE'] = 'SimpleCache'
app.config['CACHE_DEFAULT_TIMEOUT'] = 300  # 缓存超时时间,单位秒

# 绑定Cache到Flask应用
cache = Cache(app)

延迟初始化(适用于应用工厂模式):

from flask import Flask
from flask_caching import Cache

cache = Cache()  # 先创建Cache实例

def create_app():
    app = Flask(__name__)
    app.config['CACHE_TYPE'] = 'SimpleCache'
    app.config['CACHE_DEFAULT_TIMEOUT'] = 300
    
    # 完成与应用的绑定
    cache.init_app(app)
    return app

2. 优化视图中的Cache导入

你现在在get_cache和set_cache方法里每次都用from app import cache,虽然能工作,但更整洁的方式是在视图文件顶部一次性导入:

# main_views.py 顶部
from app import cache
from flask import render_template, redirect, url_for, jsonify, request
# ...其他必要导入

class BaseQuestionView(MethodView):
    decorators = [auth_required('session')]
    def get_model(self, id):
        question = Question.query.filter_by(id=id).first()
        if question.user == current_user:
            return question
        else:
            raise InvalidUser()
    def get_cache_key(self, id):
        return "{0}_question_status".format(id)
    def get_cache(self, id):
        return cache.get(self.get_cache_key(id))  # 去掉内部的import
    def set_cache(self, id, val):
        return cache.set(self.get_cache_key(id), val)  # 去掉内部的import

3. 排查重复创建Cache实例的问题

如果你的项目中在其他地方又创建了新的Cache()实例,这会导致和应用绑定的实例与视图中导入的实例不一致,也会引发KeyError。确保整个项目中只存在一个全局的Cache实例。

额外注意事项

  • 如果生产环境要使用Redis或Memcached作为缓存后端,需要安装对应的依赖包(比如redis),并修改配置:
    # Redis配置示例
    app.config['CACHE_TYPE'] = 'RedisCache'
    app.config['CACHE_REDIS_URL'] = 'redis://localhost:6379/0'
    
  • 确认你的Flask应用上下文已经正确推送,不过在视图函数中(被路由装饰的方法),Flask会自动处理上下文,所以这部分一般不会出问题。

按照以上步骤调整后,应该就能解决这个KeyError问题了。

内容的提问来源于stack exchange,提问作者user9538110

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:33:46