Кэширование
Когда ваша программа работает медленно, добавьте кэши. Ну, по крайней мере, это самый простой способ ускорить работу. Что делает кэш? Допустим, у вас есть функция, которая выполняется долго, но результаты останутся достаточно актуальными, если они будут иметь 5-минутную давность. В этом случае результат вычисления помещается в кэш на некоторое время.
Flask сам по себе не предоставляет кэширование, но Werkzeug, одна из библиотек, на которой он основан, имеет некоторую очень базовую поддержку кэша. Он поддерживает несколько бэкэндов кэша, обычно вы хотите использовать сервер memcached.
Настройка кэша
Вы создаёте объект кэша один раз и храните его, аналогично тому, как создаются объекты Flask. Если вы используете сервер разработки, вы можете создать объект SimpleCache, который представляет собой простой кэш, хранящий элемент в памяти интерпретатора Python:
from werkzeug.contrib.cache import SimpleCache cache = SimpleCache()
Если вы хотите использовать memcached, убедитесь, что у вас есть один из поддерживаемых модулей memcache (вы получаете их из PyPI) и сервер memcached работает где-то. Вот как вы подключаетесь к такому серверу memcached:
<from werkzeug.contrib.cache import MemcachedCache cache = MemcachedCache(['127.0.0.1:11211'])
Если вы используете App Engine, вы можете легко подключиться к серверу кэша App Engine:
<from werkzeug.contrib.cache import GAEMemcachedCache cache = GAEMemcachedCache()
Использование кэша
Теперь как можно использовать такой кэш? Существует две очень важные операции: get() и set(). Вот как их использовать:
Чтобы получить элемент из кэша, вызовите get() со строкой в качестве имени ключа. Если элемент есть в кэше, он возвращается. В противном случае функция вернёт None.
rv = cache.get('my-item')
Чтобы добавить элементы в кэш, используйте метод set(). Первый аргумент — ключ, а второй — значение, которое должно быть установлено. Также можно указать таймаут, после которого кэш автоматически удалит элемент.
Вот полный пример, как это обычно выглядит:
<def get_my_item():
rv = cache.get('my-item')
if rv is None:
rv = calculate_value()
cache.set('my-item', rv, timeout=5 * 60)
return rv
© 2007–2020 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/0.12.x/patterns/caching/