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

Carlos Guerrero guerrerocarlos en gmail.com
Dom Feb 5 23:21:44 ART 2012


2012/2/5 Mariano Guerra <luismarianoguerra en gmail.com>:
> 2012/2/5 Facundo Olano <facundo.olano en gmail.com>:
>> 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. 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, 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í.
>
> esta es mi experiencia, no es una respuesta pero puede servirte.
>
> el modelo mas simple es hacer que el server sea simplemente una API
> REST y toda la ui este en el cliente, es el mas simple porque
> automaticamente tenes una API y eventualmente podes tener mas de una
> UI (desktop, web, mobile, CLI).
>
> opcion dos como dijiste, usar mustache en el server y el cliente,
> aprovecho para agregar http://documentcloud.github.com/backbone/ como
> opcion para mantener modelos en sincronia entre cliente y server (no
> hace comet o websockets pero te permite empujar cambios al server y
> renderizar partes de la pagina cuando un modelo cambia).
>
> ideas que no use pero te pueden servir:
>
> * usar algo como pyjamas para generar el codigo del cliente
> * algo mas light seria generar el modelo del cliente en base a
> introspeccionar tus modelos de django o similar
> * hacer validacion con jsonschema o similar asi podes reusar la
> validacion de los modelos de los dos lados
>
> espero que sirva de algo.
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar

Por que no simplemente dejas vacios esos espacios cuando generas el
template en Django, y en javascript pones que tan pronto la pagina
cargue (document.ready) se ejecuten los javascripts que usas
actualmente para actualizarla, pero seria entonces para
"inicializarla".

De ese modo no tienes nada duplicado, el javascript se encargaria
tanto de la inicializacion como de la actualizacion de la informacion
en la pantalla.

No se si me explico ?

-- 
Atte:
Carlos A. Guerrero M.
http://www.carlosguerrero.com



More information about the pyar mailing list