es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La caché no funciona para la API POST de Django RestFramework.

Tengo configuraciones de caché en settings.py

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': 'django_cache',
    }
}

en view.py

from django.views.decorators.cache import cache_page
from rest_framework.response import Response

@cache_page(60*15)
@api_view(['POST', 'GET'])
def get_route(request):
    res = {}
    # algunos cálculos.
    return Response(res)

envía con este json

{ 
"ids_item":[4,1,2,3],
"id":10
}   

En el primer acceso, se crea un archivo de caché en el directorio django_cache. (OK, está bien y suave).

Sin embargo, en el segundo acceso con el mismo json, calcula nuevamente y crea otro archivo de caché.

Quiero usar la caché solamente cuando el json sea el mismo.

¿Cómo puedo hacer esto?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para utilizar la caché cuando los datos JSON son iguales, es necesario incluir los datos JSON en la clave de la caché. La clave de la caché es un identificador único para cada elemento en caché, por lo que al agregar los datos JSON a la clave, se podrá distinguir entre diferentes datos y solo se almacenarán en caché los datos que no hayan sido almacenados en caché anteriormente.

    Para hacer esto, se puede modificar el decorador cache_page para incluir los datos JSON en la clave de la caché. Aquí tienes un ejemplo:

    from django.core.cache import cache
    from django.views.decorators.cache import cache_page
    from rest_framework.response import Response
    from rest_framework.decorators import api_view
    
    @api_view(['POST', 'GET'])
    @cache_page(60*15, key_prefix='get_route')
    def get_route(request):
        cache_key = str(request.data)
        cached_result = cache.get(cache_key)
    
        if cached_result:
            # si el resultado está en caché, se devuelve el resultado en caché
            return Response(cached_result)
        else:
            res = {}
            # algún cálculo.
            # se almacena el resultado en caché
            cache.set(cache_key, res)
            return Response(res)
    

    En este ejemplo, primero creamos una clave de caché utilizando los datos JSON al convertirlos en una cadena. Luego comprobamos si el resultado ya está en caché utilizando cache.get() y pasando la clave de la caché. Si el resultado está en caché, se devuelve el resultado en caché. Si no lo está, se realiza el cálculo y se almacena el resultado en caché utilizando cache.set() y pasando la clave de la caché y el propio resultado.

    Al incluir los datos JSON en la clave de la caché, esto asegura que el resultado solo se almacenará en caché si los datos JSON son iguales a la clave de un elemento en caché.

Comments are closed.