Кэш Flask выдает ошибку — KeyError:Объект кэша в 0x7ff585e47358>

#flask #python-3.6

#flask #python-3.6

Вопрос:

Я пытаюсь добавить кэширование в мое приложение Python Flask. Я сделал то, что предлагают страницы кэширования Flask, поэтому у меня есть это в модуле приложения:

 config = {
    # "DEBUG": True,
    "env": 'dev',
    "secret_key": 'my secret stuff',
    "CACHE_TYPE": "simple",
    "CACHE_DEFAULT_TIMEOUT": 300
}

app = Flask(__name__)
app.config.from_mapping(config)
cors = CORS(app, resources={"/api/*": {"origins": "*"}})
cache = Cache(app)
cache.init_app(app)


@app.before_first_request
def init_resources():
    Database.initialize()


app.register_blueprint(auth_api_blueprint, url_prefix="/api/auth")
app.register_blueprint(user_api_blueprint, url_prefix="/api/user")
app.register_blueprint(year_api_blueprint, url_prefix="/api/year")
app.register_blueprint(notice_api_blueprint, url_prefix="/api/notice")
app.register_blueprint(event_api_blueprint, url_prefix="/api/event")
app.register_blueprint(admins_api_blueprint, url_prefix="/api/admin")
app.register_blueprint(guardian_api_blueprint, url_prefix="/api/guardian")
app.register_blueprint(employee_api_blueprint, url_prefix="/api/employee")
app.register_blueprint(student_api_blueprint, url_prefix="/api/student")
app.register_blueprint(teacher_api_blueprint, url_prefix="/api/teacher")

if __name__ == '__main__':
    with app.app_context():
        cache.clear()
        
    # app.run(port=8080) - port does not work here, it is still default 5000
    app.run()
  

затем я применил кешированный декоратор к методу следующим образом:

 from common.database import Database
from common.decorators import requires_login

year_api_blueprint = Blueprint('api/year', __name__)

from src.app import cache

@year_api_blueprint.route('/all')
@cache.cached(timeout=500, key_prefix="years")
# @requires_login - this need to be public
def get_all_years():
    data = Database.find("years", {})
    if data is not None:
        return jsonify([year for year in data])
  

кажется, все работает нормально, и год выше больше не вызывается много раз (только один раз)
Однако я получаю эту ошибку каждый раз, когда используются кэшированные годы:

 127.0.0.1 - - [20/Oct/2020 17:36:32] "OPTIONS /api/year/all HTTP/1.1" 200 -
Exception possibly due to cache backend.
Traceback (most recent call last):
  File "/home/smoczyna/Python-Projects/SchoolMateAPI/venv/lib/python3.6/site-packages/flask_caching/__init__.py", line 435, in decorated_function
    rv = self.cache.get(cache_key)
  File "/home/smoczyna/Python-Projects/SchoolMateAPI/venv/lib/python3.6/site-packages/flask_caching/__init__.py", line 244, in cache
    return app.extensions["cache"][self]
KeyError: <flask_caching.Cache object at 0x7ff585e47358>
  

Я видел похожий пост здесь, но я не понимаю решения и не знаю, как его применить. У меня больше ничего нет о кэше в приложении.

Итак, мой вопрос в том, что здесь отсутствует или неправильно настроено?

Комментарии:

1. В какой строке он выдает Keyerror?

2. Попробуйте использовать контекстный декоратор следующим образом: gist.github.com/TheLittleNaruto /…

3. спасибо за ответ, ошибка возникает при каждом методе, украшенном @cache.cached() . Добавление @app.context_processor, похоже, не дает никакого эффекта, ошибка по-прежнему появляется при добавлении @app.app_context() причина ошибка компиляции / времени выполнения: ошибка типа: объект ‘AppContext’ не вызывается