Tengo una aplicación web que extrae datos de BigQuery a mis vistas de Django, que luego se pasarán como contexto a las plantillas de interfaz. Sin embargo, este proceso de extracción de datos ocurrirá inicialmente cuando abra la web y volverá a ocurrir cada vez que actualice la página. ¿Hay alguna forma de almacenar en caché los datos que extraje?
Mi código views.py se parece a esto:
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)Pasé los datos como un JSON al contexto porque los estoy pasando a una interfaz React.
Hay muchas formas de almacenar datos en caché en Django, aquí te mostraré la más rápida y eficiente según Django Doc : memcached
Descargue e instale memcached: si está en Linux, descárguelo desde https://memcached.org/downloads . ./configure && make && sudo make install para instalar. Después de instalar Memcached, abra un shell e inícielo con el siguiente comando: memcached -l 127.0.0.1:11211
Instale enlaces de Python: después de instalar Memcached, debe instalar sus enlaces de Python. Puedes usar pymemcache , pip install pymemcache .
Agregue la configuración de memcached a su proyecto:
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache', 'LOCATION': '127.0.0.1:11211', } }Niveles de caché: Django proporciona los siguientes niveles de almacenamiento en caché, enumerados aquí por orden ascendente de granularidad:
vistas.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) Así es como funciona: si cached_data_json está presente en el caché, utilícelo; de lo contrario, realice un nuevo cálculo y guárdelo en el caché como cached_data_json .
OPCIONAL: puede usar django-memcache-status para monitorear Memcached .