Primeros pasos con Merengue en Django 1.3

La versión 0.8 de Merengue va a centrarse en mayor medida en tener un CMS production ready para grandes portales web, con una carga dinámica importante y un número de peticiones elevados.

Una de las acciones a tomar será compatibilizarlo con la versión 1.3 de Django, ya que, sobre todo a partir de la versión 1.2, se han realizado muchas mejoras en rendimiento, escalabilidad, robustez y seguridad. Así, compatibilizarlo con Django 1.3 (hasta ahora usaba Django 1.1) es una de las mejores formas de preparar Merengue para grandes webs.

Las mejoras que dispondríamos relativas a estas cuestiones serían:

  • ORM multidatabase. Con poco esfuerzo puedes tener varias bases de datos configuradas en cluster.
  • Caché de plantillas. La página inicial de Merengue, cuando entramos como un usuario autenticado, nada más instalar Merengue, renderiza ni más ni menos que 87 plantillas, pero tenemos casos de proyectos con vistas que renderizan hasta 206 plantillas. Estos números no son habituales en aplicaciones web ad-hoc, pero Merengue es un CMS pluggable de propósito general. El número es tan elevado porque:
    • Merengue renderiza las páginas a partir de elementos pequeños (bloques, acciones, viewlets, etc.) que pueden ser movidos configurados y desactivados por el gestor. Esta flexibilidad casi infinita tiene el inconveniente de renderizar los fragmentos de la página de forma separada, lo cual también es bueno para permitir que los desarrolladores integren sus plugins.
    • Merengue usa bastante la herencia de plantillas, por ejemplo para su sistema de temas (theming) y para los bloques. Por ejemplo cada bloque suele heredar de una plantilla padre que incluye herramientas para gestionarlos, moverlos, configurarlos, etc.
  • Protección contra ataques CSRF, para evitar que otras webs hackeadas puedan alterar datos de la nuestra.
  • Claves naturales en Fixtures, perfectas para mejorar el deployment. Por ejemplo para exportar automáticamente la configuración de un sitio Merengue (con el tema activo, los bloques, plugins activados, configuración, etc.) e importarlos en otro sitio distinto.
  • Uso de Model.objects.only(...), para seleccionar campos sueltos de las tablas, y no tener que cargar toda la tabla completa para cuando listas solo un par de campos en ella. Esto puede ser muy útil por ejemplo para las colecciones, ya que si el gestor define los campos que muestra, ¿para qué tener que obtener todos los demás si nunca van a salir?
  • Framework para Logging (1.3), que ya era hora de que se incluyera en este framework. Así evitamos el estar poniendo print y podemos configurarlo para enviar entrada a fichero, email, etc.
  • Ficheros estáticos (1.3). En Django 1.3 se distinguen los ficheros subidos por los usuarios de los servidos por el sistema. También hay herramientas de sincronización al directorio que sirve el servidor web usado. Merengue también tiene funcionalidades que equivalen a las de Django (y las superan en algunos casos), con los que habrá que pensar más tranquilamente como unir los caminos.

Pues bien, ya hemos empezado el trabajo de compatibilizarlo con Django 1.3, realizado en una rama aparte de código y las noticias son muy buenas... tan buenas... que puedo decir que tras unas 6 horas de trabajo la tarea está casi concluida. Falta probarlo bien y corregir los problemillas que surjan, pero tras múltiples refactorizaciones, fallitos corregidos, pruebas y pruebas, casi está listo (el trabajo se puede ver en el ticket #1568).

Benchmarkings preliminares

Lo primero que he realizado tras comprobar que funciona bien han sido pruebas de carga simples, comparando Merengue (rama trunk/) + Django 1.1 y Merengue (rama django1.3_compat) + Django 1.3, con y sin caché de plantillas habilitado (usando caché de memoria local).

Aquí los resultados:

  • Merengue con Django 1.1:
    • Vista con 87 plantillas: 2.85 [#/sec]
    • Vista con 209 plantillas: 1.20 [#/sec]
  • Merengue con Django 1.3:
    • Vista con 87 plantillas, sin cache: 2.88 [#/sec]
    • Vista con 87 plantillas, CON cache de plantillas: 6.35 [#/sec]
    • Vista con 209 plantillas, sin cache: 1.06 [#/sec]
    • Vista con 209 plantillas, CON cache de plantillas: 6.35 [#/sec]

 

 

Conclusiones del benchmark:

  • La caché de plantillas aumenta drásticamente el rendimiento de un sitio.
  • Cuanto más plantillas renderiza una vista, más se nota el aumento de rendimiento. De hecho en las pruebas se ve que se consiguen los mismos resultados con 87 plantillas y con 206, lo que denota que el tiempo de localizarlas en el sistema de ficheros y compilarlas es mucho más importante que el tiempo de renderizado de las mismas.