Параметр unless
Параметр unless применяется в декораторах кэширования Flask-Caching, таких как cached и memoize. Он принимает callable-объект (функцию), которая вызывается при каждом запросе. Если эта функция возвращает True, то результат текущего вызова не будет сохраняться в кэш. Если возвращается False, кэширование работает как обычно. Параметр удобно использовать, когда нужно обходить кэш при определённых условиях, например, для авторизованных пользователей.
Синтаксис
@cache.cached(timeout, unless=condition_func)
Пример
Давайте создадим простое приложение с кэшированием и отключим кэш, если передан параметр nocache:
from flask import Flask, request
from flask_caching import Cache
app = Flask(__name__)
app.config['CACHE_TYPE'] = 'simple'
cache = Cache(app)
def skip_cache():
return request.args.get('nocache') == '1'
@app.route('/')
@cache.cached(timeout=60, unless=skip_cache)
def index():
return 'hello'
При обращении к адресу / результат сохраняется в кэш. При обращении к /?nocache=1 функция skip_cache вернёт True, и кэш использоваться не будет.
Пример
Давайте отключим кэширование для авторизованных пользователей:
from flask import Flask, session
from flask_caching import Cache
app = Flask(__name__)
app.secret_key = 'secret'
app.config['CACHE_TYPE'] = 'simple'
cache = Cache(app)
def is_logged_in():
return 'user' in session
@app.route('/')
@cache.cached(timeout=120, unless=is_logged_in)
def index():
return 'hello'
Для гостей страница кэшируется, а для авторизованных пользователей результат всегда вычисляется заново.
Пример
Давайте применим unless вместе с декоратором memoize:
from flask import Flask, request
from flask_caching import Cache
app = Flask(__name__)
app.config['CACHE_TYPE'] = 'simple'
cache = Cache(app)
def bypass():
return request.args.get('fresh') == '1'
@cache.memoize(timeout=300, unless=bypass)
def get_data(param):
return 'abcde' + param
@app.route('/data/<param>')
def data(param):
return get_data(param)
Функция get_data кэшируется по аргументу param, но при наличии параметра fresh=1 в запросе результат не будет сохранён в кэш.
Смотрите также
-
декоратор
cached,
который кэширует результат представления -
декоратор
memoize,
который кэширует результат функции по её аргументам -
параметр
timeout,
который задаёт время жизни кэша -
параметр
forced_update,
который принудительно обновляет кэш