2014-04-23 5 views
1

Flask 캐시 모듈을 사용하고 있고 런타임 오류가있는 경우 캐시 된보기를 원하지 않는 문제가 있습니다.Flask보기에서 오류가 발생하는 경우 redis 캐시 객체를 무효화하거나 삭제하는 방법

아무에게도 조언을 줄 수 있습니까?

다음은 내가 달성하고자하는 것입니다.

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

당신은 after_this_request 핸들러에서 cache.delete_memoized를 호출 할 수

# @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(): 
      mycache.delete_memoized('process_view') 

     return print_error_and_no_cache_this_view() 

다른 방법을, 그것을 does not handle errors thrown by the view 나타납니다 플라스크 - 캐시의 코드를 찾고 있습니다. 그래서 단순히 오류를 직접 제기하고 별도의 핸들러로 예외를 처리 할 수있는 :

@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()  
+0

당신이 \ @cached에 대한 주석에서 무엇을 의미합니까 것은 @route하지만 다음의 예에서 그들이 \ 전에 가야합니다 다른 길은? – Andrew

+0

@Andrew - 미안하지만, 나는'@cached'가 소스 순서가 아닌 * 실행 * 순서에서'@ 경로 '앞에 올 필요가 있다는 것을 의미했습니다. 데코레이터는 가장 안쪽까지 실행되므로 함수에 가장 가까운 것이 실행되고 그 다음에는 위의 것이 실행되고 그 다음에는 위의 실행이 차례로 수행됩니다. 기본적으로, 당신은 당신의 코드가 다음과 같이하고 싶어한다 : process_view = mycache.cached (app.route (process_view -> code))보다는'process_view = app.route (mycache.cached (process_view -> code) ' –

관련 문제