[pyar] Aplicaciones web en tiempo real y duplicación de código en el front-end

Facundo Olano facundo.olano en gmail.com
Dom Feb 5 17:23:24 ART 2012


Qué tal;

Ultimamente estuve trabajando en una aplicación Django, en la que se
requería mucha actualización en tiempo real de los contenidos de la página.
A lo que me refiero con actualización en tiempo real es que el servidor
podía publicar modificaciones y los clientes que estaban suscriptos a ellas
modificaban la página en consecuencia.

El problema recurrente con el que me encontré es que existía una cierta
duplicación entre la construcción de las páginas "estáticamente" con los
templates de django, al cargarlas, y la actualización "a mano" que tenía
que hacer con js cuando el server publicaba una modifiación. Por citar un
ejemplo, tenía chats embebidos que al cargar la página mostraban los
últimos mensajes (esto lo hacía con un for en el template) y a su vez cada
vez que entraba un mensaje nuevo, recibía desde el servidor los parámetros
(nombre, avatar, contenido) vía json y armaba el div usando js/jquery. Si
modificaba la estructura html del mensaje de chat tenía actualizar tanto el
template django, como la función js que lo construía en las
actualizaciones. Y éste es solo un caso simple; había otros elementos más
complejos en la interfaz que reflejaban distintos estados de modelos de
django, y más allá de la duplicación, se volvía muy engorrosa la lógica
involucrada en el front end para manterlos consistentes.

Entiendo que este tipo de aplicaciones son relativamente cotidianas, así
que me interesa conocer qué experiencia tienen tratando de resolverlas de
manera consistente y elegante. Las soluciones que encuentro son:

   - Renderizar en el servidor los divs que haya que actualizar, usando
   templates de django y mandar eso en el json en vez de los parámetros que
   cambiaron. Esto es lo que hice en su momento, aunque no soluciona del todo
   el problema y para mi gusto hace en el servidor cosas que estarían mejor en
   el cliente.
   - Usar alguna forma de templating en el cliente, por ejemplo
Mustache<http://mustache.github.com/>.
   Lo que me gusta de esta solución es que podría reusar los templates tanto
   en cliente como en el servidor, sería similar a lo que hago ahora con los
   de django, pero moviendo el trabajo al cliente.
   - Usar alguna librería js, por ejemplo
Knockout.js<http://knockoutjs.com/documentation/observables.html>,
   que simplifique la tarea de mantener la consistencia entre el modelo
   server-side y el contenido HTML que refleja su estado.
   - Ya el caso extremo (y que preferiría evitar) sería considerar
   abandonar django del todo y en el futuro este tipo de aplicaciones
   resolverlas con alguna combinación de frameworks js que me permita reusar
   código en backend y frontend (algo del estilo node.js+backbone.js+
   socket.io+CoffeeScript).

La última alternativa escapa un poco a esta lista, pero sería interesante
saber si alguien tuvo experiencia combinando Django (u otro framework de
similares características) con Mustache, Knockout u otras herramientas para
tratar de resolver los problemas que describí.
Saludos,
Facundo.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20120205/17d75a1e/attachment.html>


More information about the pyar mailing list