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.

Zappa Django: en lugar de volver a consultar la base de datos, utiliza una caché obsoleta en memoria. ¿Se puede cambiar este comportamiento?

En mi proyecto, utilizo Django como frontend únicamente. Todas las funciones de backend son varias funciones Lambda de Python de AWS coordinadas por la máquina de estados. La base de datos es SQLite en el bucket de S3. Utilizo django_s3_storage y django_s3_sqlite. Mis funciones de backend cambian la cantidad de instancias del modelo y sus detalles en la base de datos SQLite. Me gustaría que esos cambios se reflejen en el frontend de Django lo antes posible. Sin embargo, no sucede así. Sólo veo la caché obsoleta en memoria.

He intentado varias cosas.

Mi vista inicial:

class AllPortfolioRowsView(ListView):
model = PortfolioRow
template_name = “portfolio_all_rows.html”

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    # hacer algo más
    context['object_list'] = PortfolioRow.objects.all().order_by('row_type')
    return context

He leído el consejo de hacer cosas dentro de la función get. En este caso, supuestamente, debe ejecutarse una consulta a la base de datos cada vez que se llama a la función.

Variante #2:

class AllPortfolioRowsView(View):
def get(self, request):
template = loader.get_template(‘portfolio_all_rows.html’)
object_list = PortfolioRow.objects.all().order_by(‘row_type’)
# hacer algo más
context = {
‘object_list’: object_list,
# otras cosas
}
return HttpResponse(template.render(context, request))

Funcionó pero no ayudó.

Luego intenté forzar la consulta a la base de datos, como recomienda la documentación de Django.

Variante #3:

class AllPortfolioRowsView(View):
def get(self, request):
template = loader.get_template(‘portfolio_all_rows.html’)
object_list = PortfolioRow.objects.all().order_by(‘row_type’)
for elem in object_list: # iteración
counter = counter + 1
print(counter, ‘ – ‘, elem)
_ = list(object_list) # crear lista para forzar la reevaluación
# hacer algo más
context = {
‘object_list’: object_list,
# otras cosas
}
return HttpResponse(template.render(context, request))

Tampoco ayudó.

Sólo desactivar el evento periódico de keep_warm en zappa-settings.json ayudó. Después de eso, si no hay llamadas, el servidor se libera en 10-15 minutos, y la caché obsoleta desaparece. En la siguiente llamada, el sistema no tiene más opción que hacer una nueva consulta a la base de datos y mostrar los datos recientes.

¿Existe una solución mejor?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una solución potencial para asegurar que el frontend refleje los cambios en la base de datos sería implementar un mecanismo de actualizaciones en tiempo real mediante websockets o polling. Esto implicaría establecer un sistema en el que el backend envía notificaciones al frontend cada vez que hay un cambio en la base de datos, lo que desencadena actualizaciones en tiempo real.

    Otro enfoque podría ser implementar mecanismos de caché con tiempos de expiración más cortos, para que los datos en la caché se actualicen con más frecuencia. Esto podría implicar el uso de un backend de caché como Redis, y establecer un tiempo de espera más bajo para la expiración de la caché.

    También es posible utilizar otros servicios de AWS como AWS RDS o DynamoDB, que proporcionan servicios de bases de datos administrados que pueden integrarse más fácilmente con Django, y pueden ofrecer un mejor rendimiento y escalabilidad que el uso de SQLite en un bucket de S3.

    En última instancia, la elección de la solución dependerá de los requisitos y limitaciones específicos del proyecto, así como de los recursos y habilidades disponibles del equipo de desarrollo.

Comments are closed.