En este apunte voy a desgranar/explicar un poco mi experiencia en el cambio de php a django. Pero primero voy a resaltar un poquito los motivos que me hicieron decidir...
En este apunte voy a desgranar/explicar un poco mi experiencia en el cambio de php a django. Pero primero voy a resaltar un poquito los motivos que me hicieron decidir:
Debía de empezar a desarrollar un pequeño sistema de reservas y en php me notaba cansado y desmotivado.
Había analizado muchos marcos de php y ninguno me parecía adecuado, quizá por haber probado en un primer momento RoR. Aunque Rails me parecía fantástico había ciertas cosas que no me gustaban.
Django lo había mirado, y me parecía bastante interesantes, de hecho, en mi miniframework php había tomado prestadas bastantes ideas.
Asistí a una charla, realizada por aaloy http://www.trespams.com), donde explicaba las virtudes de python y django. Además, disponía de soporte en aspl. Por primera vez no estaba solo aprendiendo una tecnología!
Había usado python para realizar gráficos experimentales con nodeBox, y me parecía un lenguaje muy cómodo. Mis primeros lenguajes fueron, logo, basic y pascal, perl, javascript, php, java, ruby (python se parece ...?)
También tenía ciertas dudas respecto al proyecto: Lanzarse a la piscina para un proyecto para un cliente, podía parecer muy arriesgado, pero la verdad, el tema me motivaba y me sentía capaz de salir airoso de la batalla. ¿Y que mejor que desarrollar un proyecto para aprender una tecnología? Algunos centenares de líneas de código después, puede ofrecer algunas indicaciones beneficios para muchos desarrolladores web inquietos, que no estan seguros de cambiar.
Dicho lo cual, solo queda explicar un poco el proyecto, construir un pequeño motor de reservas para un conjunto de 30 apartamentos turísticos de distintos tamaños y formas alquilables por días.
ORM: Object Relational Mapper. Había trabajado con el ActiveRecord de Rails, y para php no había encontrado ninguna opción que me pareciese lo suficiente ágil... en la mayoría debes de recurrir a tediosos sistemas de configuración. En mi, mf, uso un OM (Object Mapper), basado en PDO, pero que no ofrece la capa relacional (La desarrollas a mano). El de Django, fué fantástico. Construyes los modelos que deseas, definiendo los campos como propiedades de la clase y asignando a ellas un objeto del tipo deseado (Hay multitud y puedes crear de nuevos). A partir de aquí, django se vuelve fantástico, y el solo, es capaz de generar el sql para crear la base de datos, generar formularios para interactuar con tu modelo, validar entradas y salidas, y construir un sistema de consulta sobre la base de datos extramadamente potente. Pero aún así, si crees que puedes optimmizar algo, mediante SQL, puedes interactuar como quieras. (El método que busca los apartamentos libres dentro de la tabla disponibilidad, está picado directamente en sql, ya que usa un group_by que no sería muy objetable ...)
Aplicaciones, modulos y urls: Una de las bazas fantásticas de python y a su vez de django son las convenciones. Multitud de parámetros y configuraciones funcionan así. Por lo tanto, debía de trabajar en una aplicación reservas que contendría distintos módulos que desarrollaría progresivamente: El propio sistema de disponibilidad/reserva, un mini crm (facturación y clientes), datos estadísticos, vistas publicas del web, proceso de reserva.... Pero como juntas todo esto y lo mezclas en un proyecto? La fuerza de django biene del sistema de urls. Una url, es la base de una aplicación web, ya que conecta una dirección web con una función en una vista. En php, esto también es así (si lo defines así) y mediante .htaccess lo puedes configurar perfectamente, pero en django es trivial (Construyes listas mediante la función url(), que admite parametros como la vista, y el patrón a mapear y voilà, solucionado...) Además y como bonus, el sistema de urls, es extramadamente flexible, ya que está pensado para no repetirse... puedes definir urls de forma parámetrica dentro de un módulo, para luego ser montadas desde la aplicación padre.
Sistema de usuarios, grupos y permisos: En mi mf dispongo de un pequeó sistema de usuarios y permisos (si desarrollas apliaciones web de cierta complejidad es indispensable), y me he roto la cabeza muchas veces en como estructurar, organizar y gestionar el sistema.... En django está perfectamente solucionado, y además es absolutamente transaparente: Por un lado, dispones de un sistema de usuarios, grupos y permisos, que automaticamente genera permisos CRUD para todos los modelos registrados en una apliación. Al mismo tiempo, dispones de decoradores, para las vistas que te permiten validar mediante una sola línea de código, el usuario, el grupo y los permisos de grupo. En definitiva, un problema menos a la hora de producir/desarrollar una aplicación compleja.
Formularios: La entrada y salida de datos de una apliación web, es uno de los puntos críticos para cualquier desarrollador. En Django, esto se realiza mediante formularios, que pueden crearse des de 0, o a partir de los modelForms, Formularios originados des de un modelo (potente concepto), todo lo del modelo más lo que quiera cambiar. A partir de esto, en las vistas, realizar una validación para grabar, es tan fácil como llamar a form.is_valid()... devuelve true/none :)
Generador de administradores: Una de las partes más tediosas cuando desarrollas aplicaciones web, es implementar una y otra vez operaciones CRUD sobre la base de datos. Para esto, el sistema de adminstración de que dispone django es fenomenal. Claro, simple y bien escrito, se lo analizas y estudias un poco, te permite tunearlo hasta el ultimo detalle y la verdad, te ahorra muchísimo trabajo.
Sistema de plantillas: Quizá es la baza más debil de django. Acostumbrado a php que es un lenguaje de plantillas en el mismo, y dispone de herramientas realmente potentes como los tags cortos o las expresiones condicionales sin {}. En esto, django me ha resultado tedioso, por varios motivos: Primero porque me faltaban acciones y filtros, segundo, porque no disponía de acceso a los modelos directamente... (Yo soy organizado, y no quería realizar operaciones en las plantillas, pero a veces, necesitas acceder a una lista de algo y .... ). Pero bueno, al final, vas avanzando y aprendes pequños truquitos que te hacen la vida más cómoda.
Comandos y acciones de shell. Sistema de importación. En cualquier aplicación web, mínimamente compleja, necesitamos crear scripts, comandos o acciones que funcionarán mediante shell o cron. En nuestro caso, debíamos generar scripts que importasen datos de la apliación actual usada en el sistema de apartamentos a nuestro django: Basicamente, clientes, reservas y facturas. En django es trivial, unos cuantos imports, permisos de ejecución, y ya disponemos de un scrip que puede interactuar con cualquier parte de nuestro sistema :)
Bonus, la shell: Cuando trabajas en php, una de las partes tediosas, es no poder probar las cosas de forma ágil. Creas un nuevo método a un modelo, y, o creas un unit test, o una mini página de pruebas, sino no puedes probarlo. En django si, para cualquier duda de la shell, cualquier prueba de código, cualquier test de modelo, puedes acceder a una shell como ipython, en el entorno de la aplicación y puedes probar, ejecutar y analizar. De esta forma, el método de trabajo cambia un poco, y pasas a usar muchísimo mas la shell, para probar ejecutar el código necesario
Conclusión: Después de 2 meses de desarrollo en python y django, y de 3 iteraciones con cliente (mogollón de cambios), lo que mas me desespera es volver a programar y mantener aplicaciones que tengo en php. La verdad es que es fácil, es simple y es extremadamente potente. Invito a cualquiera a probarlo. En próximos apuntes hablaré de como lo he desplegado y de lo rápido y bien que funciona!
Entrada etiquetada como: django, php, to