Кэш
Предупреждение
Устаревшее с версии 0.15: Будет удалено в версии 1.0. Вынесено в cachelib.
werkzeug.contrib.cache
Основная проблема динамических веб-сайтов заключается в том, что они динамические. Каждый раз, когда пользователь запрашивает страницу, веб-сервер выполняет много кода, обращается к базе данных, обрабатывает шаблоны, пока посетитель не получит отображаемую страницу.
Это намного дороже, чем просто загрузка файла из файловой системы и отправка его посетителю.
Для большинства веб-приложений эта издержка не является большой проблемой, но когда это так, вы будете рады иметь систему кэширования.
Как работает кэширование
Кэширование довольно просто. В основном у вас есть объект кэша, расположенный где-то, который подключен к удаленному кэшу, файловой системе или чему-то еще. Когда поступает запрос, вы проверяете, есть ли текущая страница уже в кэше, и если да, то возвращаете ее из кэша. В противном случае вы генерируете страницу и помещаете ее в кэш. (Или фрагмент страницы, вам не нужно кэшировать все целиком)
Вот простой пример кэширования боковой панели на 5 минут:
def get_sidebar(user):
identifier = 'sidebar_for/user%d' % user.id
value = cache.get(identifier)
if value is not None:
return value
value = generate_sidebar_for(user=user)
cache.set(identifier, value, timeout=60 * 5)
return value
Создание объекта кэша
Чтобы создать объект кэша, просто импортируйте систему кэширования из модуля cache и инициализируйте его. Затем вы можете начать работать с этим объектом:
>>> from werkzeug.contrib.cache import SimpleCache
>>> c = SimpleCache()
>>> c.set("foo", "value")
>>> c.get("foo")
'value'
>>> c.get("missing") is None
True
Пожалуйста, имейте в виду, что вам необходимо создать кэш и поместить его в доступное место (либо в качестве глобального модуля, который можно импортировать, либо просто поместить его в ваше приложение WSGI).
API системы кэширования
-
class werkzeug.contrib.cache.BaseCache(default_timeout=300) -
Базовый класс для систем кэширования. Все системы кэширования реализуют этот API или его надмножество.
Параметры: default_timeout – стандартный таймаут (в секундах), используемый, если таймаут не указан в set(). Таймаут 0 означает, что кэш никогда не истекает.-
add(key, value, timeout=None) -
Действует так же, как
set(), но не перезаписывает значения уже существующих ключей.Параметры: - ключ – ключ для установки
- значение – значение для ключа
- timeout – таймаут кэширования для ключа в секундах (если не указано, используется стандартный таймаут). Таймаут 0 означает, что кэш никогда не истекает.
Возвращает: То же, что и
set(), но такжеFalseдля уже существующих ключей.Тип возвращаемого значения: boolean
-
clear() -
Очищает кэш. Имейте в виду, что не все кэши поддерживают полную очистку кэша.
Возвращает: Была ли очищена кэшированная система. Тип возвращаемого значения: boolean
-
dec(key, delta=1) -
Уменьшает значение ключа на
delta. Если ключ еще не существует, он инициализируется значением-delta.Для поддерживаемых кэшей это атомарная операция.
Параметры: - ключ – ключ для инкремента.
- delta – разница для вычитания.
Возвращает: Новое значение или
Noneв случае ошибок на стороне бэкенда.
-
delete(key) -
Удалить
keyиз кэша.Параметры: ключ – ключ для удаления. Возвращает: Существовал ли ключ и был ли удален. Тип возвращаемого значения: boolean
-
delete_many(*keys) -
Удаляет несколько ключей одновременно.
Параметры: ключи – функция принимает несколько ключей в качестве позиционных аргументов. Возвращает: Были ли удалены все заданные ключи. Тип возвращаемого значения: boolean
-
get(key) -
Ищет ключ в кэше и возвращает значение для него.
Параметры: ключ – ключ для поиска. Возвращает: Значение, если оно существует и доступно, иначе None.
-
get_dict(*keys) -
Как
get_many(), но возвращает словарь:d = cache.get_dict("foo", "bar") foo = d["foo"] bar = d["bar"]Параметры: ключи – функция принимает несколько ключей в качестве позиционных аргументов.
-
get_many(*keys) -
Возвращает список значений для заданных ключей. Для каждого ключа создается элемент в списке:
foo, bar = cache.get_many("foo", "bar")Имеет ту же обработку ошибок, что и
get().Параметры: ключи – функция принимает несколько ключей в качестве позиционных аргументов.
-
has(key) -
Проверяет, существует ли ключ в кэше, не возвращая его. Это недорогая операция, которая обходит загрузку фактических данных на бэкенде.
Этот метод является необязательным и может быть не реализован во всех кэшах.
Параметры: ключ – ключ для проверки
-
inc(key, delta=1) -
Увеличивает значение ключа на
delta. Если ключ еще не существует, он инициализируется значениемdelta.Для поддерживаемых кэшей это атомарная операция.
Параметры: - ключ – ключ для инкремента.
- delta – разница для добавления.
Возвращает: Новое значение или
Noneв случае ошибок на стороне бэкенда.
-
set(key, value, timeout=None) -
Добавляет новую пару ключ/значение в кэш (перезаписывает значение, если ключ уже существует в кэше).
Параметры: - ключ – ключ для установки
- значение – значение для ключа
- timeout – таймаут кэширования для ключа в секундах (если не указано, используется стандартный таймаут). Таймаут 0 означает, что кэш никогда не истекает.
Возвращает: Trueесли ключ был обновлен,Falseв случае ошибок на стороне бэкенда. Ошибки сериализации, однако, вызовут подклассpickle.PickleError.Тип возвращаемого значения: boolean
-
set_many(mapping, timeout=None) -
Устанавливает несколько ключей и значений из отображения.
Параметры: - отображение – отображение с ключами/значениями для установки.
- timeout – таймаут кэширования для ключа в секундах (если не указано, используется стандартный таймаут). Таймаут 0 означает, что кэш никогда не истекает.
Возвращает: Были ли установлены все заданные ключи.
Тип возвращаемого значения: boolean
-
Системы кэширования
-
class werkzeug.contrib.cache.NullCache(default_timeout=300) -
Кэш, который ничего не кеширует. Это может быть полезно для юнит-тестирования.
Параметры: default_timeout – фиктивный параметр, игнорируемый, но необходимый для совместимости с другими кэшами.
-
class werkzeug.contrib.cache.SimpleCache(threshold=500, default_timeout=300) -
Простой кэш в памяти для однопроцессорных сред. Этот класс в основном используется для сервера разработки и не является полностью потокобезопасным. Он пытается использовать как можно больше атомарных операций и никаких блокировок для простоты, но при высокой нагрузке может произойти ситуация, когда ключи добавляются несколько раз.
Параметры: - threshold – максимальное количество элементов, хранимых в кэше, прежде чем он начнёт удалять некоторые из них.
-
default_timeout – значение по умолчанию для таймаута, используемое, если таймаут не указан в
set(). Таймаут 0 означает, что кэш никогда не истекает.
-
class werkzeug.contrib.cache.MemcachedCache(servers=None, default_timeout=300, key_prefix=None) -
Кэш, использующий memcached в качестве бэкенда.
Первый аргумент может быть объектом, напоминающим API
memcache.Client, или кортежем/списком адресов сервера. Если передается кортеж/список, Werkzeug пытается импортировать наиболее подходящую библиотеку memcache.Этот кэш ищет следующие пакеты/модули, чтобы найти bindings для memcached:
pylibmcgoogle.appengine.api.memcachedmemcachedlibmc
Примечания к реализации: Этот бэкенд кэша обходит некоторые ограничения memcached, чтобы упростить интерфейс. Например, ключи в формате Unicode кодируются в utf-8 на лету. Методы, такие как
get_dict(), возвращают ключи в том же формате, что и входные данные. Кроме того, все методы get молча игнорируют ошибки ключей, чтобы не создавать проблем при передаче недоверенных данных пользователя методам get, что часто происходит в веб-приложениях.Параметры: -
servers – список или кортеж адресов сервера, или же
memcache.Client, или совместимый клиент. -
default_timeout – значение по умолчанию для таймаута, используемое, если таймаут не указан в
set(). Таймаут 0 означает, что кэш никогда не истекает. -
key_prefix – префикс, добавляемый перед всеми ключами. Это позволяет использовать один и тот же сервер memcached для различных приложений. Имейте в виду, что
clear()также очистит ключи с другим префиксом.
-
class werkzeug.contrib.cache.GAEMemcachedCache -
Этот класс устарел в пользу
MemcachedCache, который теперь также поддерживает Google App Engine.Изменено в версии 0.8: Устарел в пользу
MemcachedCache.
-
class werkzeug.contrib.cache.RedisCache(host='localhost', port=6379, password=None, db=0, default_timeout=300, key_prefix=None, **kwargs) -
Использует Redis хранилище ключей-значений в качестве бэкенда кэша.
Первый аргумент может быть строкой, обозначающей адрес Redis сервера, или объектом, напоминающим экземпляр класса redis.Redis.
Примечание: Python Redis API уже обрабатывает кодирование строк unicode на лету.
Введено в версии 0.7.
Введено в версии 0.8:
key_prefixбыл добавлен.Изменено в версии 0.8: Этот бэкенд кэша теперь правильно сериализует объекты.
Изменено в версии 0.8.3: Этот бэкенд кэша теперь поддерживает аутентификацию по паролю.
Изменено в версии 0.10:
**kwargsтеперь передается в redis объект.Параметры: - host – адрес Redis сервера или объект, API которого совместим с официальным Python Redis клиентом (redis-py).
- port – номер порта, на котором Redis сервер слушает соединения.
- password – пароль для аутентификации на Redis сервере.
- db – база данных (индекс, начиная с нуля) на Redis сервере для подключения.
-
default_timeout – значение по умолчанию для таймаута, используемое, если таймаут не указан в
set(). Таймаут 0 означает, что кэш никогда не истекает. - key_prefix – префикс, который должен быть добавлен ко всем ключам.
Любые дополнительные ключевые аргументы будут переданы в
redis.Redis.
-
class werkzeug.contrib.cache.FileSystemCache(cache_dir, threshold=500, default_timeout=300, mode=384) -
Кэш, хранящий элементы в файловой системе. Этот кэш зависит от того, что он единственный пользователь
cache_dir. Абсолютно убедитесь, что никто, кроме этого кэша, не хранит файлы там, иначе кэш будет случайным образом удалять файлы.Параметры: - cache_dir – каталог, в котором хранятся файлы кэша.
- threshold – максимальное количество элементов, хранимых в кэше, прежде чем он начнёт удалять некоторые. Значение порога 0 означает, что порога нет.
-
default_timeout – значение по умолчанию для таймаута, используемое, если таймаут не указан в
set(). Таймаут 0 означает, что кэш никогда не истекает. - mode – режим файла для файлов кэша, по умолчанию 0600
-
class werkzeug.contrib.cache.UWSGICache(default_timeout=300, cache='') -
Реализует кэш с использованием фреймворка кэширования uWSGI.
Примечание
Этот класс не может использоваться при работе под PyPy, потому что реализация API uWSGI для PyPy отсутствует необходимая функциональность.
Параметры: - default_timeout – таймаут по умолчанию в секундах.
- cache – имя экземпляра кэша для подключения, например: mycache@localhost:3031, по умолчанию пустая строка, что означает, что uWSGI будет кешировать в локальном экземпляре. Если кэш находится в том же экземпляре, что и приложение Werkzeug, вам нужно только указать имя кэша.
© 2007–2020 Pallets
Licensed under the BSD 3-clause License.
https://werkzeug.palletsprojects.com/en/0.16.x/contrib/cache/