如何在Flask视图中处理错误时使Redis缓存对象失效或删除

3 投票
1 回答
2760 浏览
提问于 2025-04-18 03:54

我遇到了一个问题,我在使用Flask的缓存模块。如果出现运行时错误,我不想让这个视图被缓存。

有没有人能给我一些建议,怎么才能做到这一点呢?

这是我想要实现的效果。

from flask import Flask    
from flask.ext.cache import Cache

app = Flask(__name__)
mycache = Cache()
mycache.init_app(app)

@mycache.cached()
@app.route('/myview')
def process_view():
    try:
        return get_something()
    except:
        return print_error_and_no_cache_this_view()

有没有什么想法可以让我在出错时停止缓存这个视图?

1 个回答

2

你可以在一个叫做 cache.delete_memoized 的地方使用 after_this_request 这个处理器来调用它:

# @cached needs to be invoked before @route
# because @route registers the handler with Flask
# and @cached returns a different function.
# If you @route first and then @cache Flask will
# always execute the *uncached* version.

@app.route('/myview')
@mycache.cached()
def process_view():
    try:
        return get_something()
    except:

        @app.after_this_request
        def clear_cache(response):
            mycache.delete_memoized('process_view')
            return response

        return print_error_and_no_cache_this_view() 

另外,从 Flask-Cache 的代码来看,它似乎 并没有处理视图抛出的错误。所以你 可以 自己抛出错误,并用一个单独的处理器来处理这个异常:

@app.route('/myview')
@mycache.cached()
def process_view():
    try:
        return get_something()
    except Exception as e:
        raise ProcessViewIssue(e)

@app.errorhandler(ProcessViewIssue)
def handle_process_view_error(e):
    return print_error()    

撰写回答