Как кэшировать данные, полученные из BigQuery, в Django?
У меня есть webapp, который извлекает данные из BigQuery в мои представления Django, которые затем будут переданы в качестве контекста шаблонам frontend. Однако этот процесс извлечения данных происходит изначально, когда я открываю веб-приложение, и повторяется каждый раз, когда я обновляю страницу. Есть ли способ кэшировать данные, которые я извлек?
Мой views.py
код выглядит примерно так:
def index(request):
client = bigquery.Client()
dataset_id = "project-id.dataset-id"
tables = client.list_tables(dataset_id)
tables_list = [table.table_id for table in tables]
data_list = []
for table_id in tables_list:
query_string = f"""
SELECT *
FROM `project-id.dataset-id.{table_id}`
"""
query_job = (
client.query(query_string)
.result()
)
records = [dict(row) for row in query_job]
data_list.extend(records)
df = pd.DataFrame(data_list)
...
# Data manipulation syntax here using pandas dataframe
...
data_json = df.to_json(orient="records")
context = {'data_json': data_json}
return render(request, 'template_name', context)
Я передал данные как JSON в контекст, потому что я передаю их фронтенду React.
В Django существует множество способов кэширования данных, здесь я покажу вам самый быстрый и эффективный согласно Django Doc : memcached
Скачайте и установите memcached : Если вы на Linux, скачайте с сайта https://memcached.org/downloads.
./configure && make && sudo make install
для установки. После установки Memcached откройте оболочку и запустите его с помощью следующей команды:memcached -l 127.0.0.1:11211
Установка привязки к Python : После установки Memcached, вам необходимо установить его привязку к Python. Вы можете использовать pymemcache,
.pip install pymemcache
.Добавьте настройки memcached в ваш проект :
.CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache', 'LOCATION': '127.0.0.1:11211', } }
Уровни кэширования : Django предоставляет следующие уровни кэширования, перечисленные здесь в порядке возрастания степени детализации:
- API кэширования низкого уровня: Обеспечивает самую высокую степень детализации. Позволяет кэшировать определенные запросы или вычисления.
- Кэш шаблонов: Позволяет кэшировать фрагменты шаблонов.
- Per-view cache: Обеспечивает кэширование для отдельных представлений.
- Пер-сайтовый кэш: Кэш самого высокого уровня. Он кэширует весь ваш сайт.
- Использование Low-Level cache API в вашем примере :
views.py
from django.core.cache import cache
def index(request):
# First, try to retrieve the cached data if exist
cached_data_json = cache.get('cached_data_json')
# If the data has not been cached yet, generate and cache it
if not cached_data_json:
client = bigquery.Client()
dataset_id = "project-id.dataset-id"
tables = client.list_tables(dataset_id)
tables_list = [table.table_id for table in tables]
data_list = []
for table_id in tables_list:
query_string = f"""
SELECT *
FROM `project-id.dataset-id.{table_id}`
"""
query_job = (
client.query(query_string)
.result()
)
records = [dict(row) for row in query_job]
data_list.extend(records)
df = pd.DataFrame(data_list)
...
# Data manipulation syntax here using pandas dataframe
...
data_json = df.to_json(orient="records")
# Cache the data
cache.set('cached_data_json', data_json)
context = {'data_json': data_json}
return render(request, 'template_name', context)
Вот как это работает: если cached_data_json
присутствует в кэше, то используйте его, иначе, сделайте новое вычисление и сохраните его в кэше как cached_data_json
.
OPTIONAL : Вы можете использовать django-memcache-status для мониторинга Memcached.