July 31, 2017

Un CMS en Django. Plasma CMS – Backend

Para este proyecto, decidí utilizar el framework para desarrollo web con Python, Django. Aquí explico las ventajas que noté al utilizar esta librería.

Nota: No busco que esto sea un tutorial de Django. Únicamente pretendo compartir mi experiencia utilizándolo en un proyecto sencillo, e invitar a otros desarrolladores a darle una oportunidad. 🙂

Recientemente terminé un proyecto en el que llevaba trabajando unas cuantas semanas, un ejercicio de programación web tanto en el backend como en el frontend.

Consiste en un motor para blogs muy simple: usuarios, grupos, categorías, posts y comentarios.

Para este proyecto, decidí utilizar el framework para desarrollo web con Python, Django. Principalmente lo elegí porque quería practicar más con este lenguaje, y las posibilidades que ofrece, y al mismo tiempo familiarizarme más con esta librería que muchas empresas el día de hoy utilizan.

La fama de Django principalmente se debe a que (como todo lo que es desarrollado en Python) es extremadamente sencillo de utilizarlo. Actualmente es ampliamente utilizado como lenguaje para realizar REST API’s con gran demanda.

Entonces, hace unos meses tomé un curso de Django, y me enamoré de la simpleza y capacidades que este framework trae consigo. Una de las mejores cosas que esta librería trae consigo, es la cantidad de herramientas para python, y la vasta abundancia de Apps existentes para integrar en tus proyectos.

Sin embargo, en esta ocasión no pensaba utilizar Apps de terceros, sino quería crearlo todo por mi cuenta para hacerlo muy personalizado.

Diseñé mis modelos y mis vistas (que serían equivalentes a los controladores en el patrón MVC). Comencé utilizando las vistas genéricas basadas en clases que trae Django por defecto para realizar el CRUD de mis modelos.

Una de las principales ventajas que trae consigo el utilizar estas vistas, es que puedes crear muy fácilmente los controladores para modelos que no requieren grandes cantidades de ingeniería por detrás. Literalmente, en 4 líneas de código, tienes creada una vista que crea registros de un modelo:

from django.views.generic import CreateView
class PostCreate(CreateView):
    model = Post
    form_class = PostForm

Así de simple tenemos creada una vista para crear Posts. Solo es necesario indicar el modelo, el formulario que utilizará y el nombre del template donde lo desplegará en caso de que queramos que tenga una interfaz para los usuarios. Sin embargo, en muchas ocasiones incluso necesitaremos menos líneas, por ejemplo, para crear una REST API, donde no necesitaremos indicar el template. Django también trae integrado un panel de control llamado el Admin, donde puedes registrar tu modelo, y manipularlo, sin llegar a necesitar las vistas (obviamente con sus limitaciones).

¿Vistas basadas en clases o en funciones?

Típico debate entre desarrolladores de Django. En mi experiencia, la respuesta se decide simplemente pensando ‘¿Qué tanta ingeniería requiere mi vista para procesar la información?’ Si estoy realizando una vista para crear un nuevo Post, que lo único que requiere es pasar la información a la base de datos que el usuario manda por el método POST, seguro puedo hacerlo en pocas líneas de código con una vista basada en cláses genéricas.

Ahora pensemos en una situación más compleja: ‘Recibo una lista de IDs por el método POST que corresponden a distintos usuarios. Por cada usuario necesito mandar un correo electrónico con un mensaje que también me envían con la petición. En caso de esta sea por el método GET, únicamente despliego el formulario’. ¿Debería utilizar una vista basada en clases genéricas o en funciones? ¿Es posible usar ambas? En mi opinión, una vista basada en funciones es mejor, puesto que tienes más control sobre lo que haces, sin embargo, también es posible realizarlo con una vista basada en clases, de preferencia desarrollando todo el proceso con una clase no genérica.

Esa es la conclusión a la que llegué tras desarrollar ciertas vistas que no se ajustaban a lo que quería hacer como clases.

Templates

Algo con lo que me topé al desarrollar mi proyecto, son todas las posibilidades que Django te proveé al momento de desarrollar tu proyecto, en cuanto a las interfaces para el usuario.

Django incluye varias formas de evitar código repetido, de transformar información para presentarla al usuario, o incluso para hacer consultas dentro tus plantillas. Cosas como las template tags, bloques, el semi lenguaje de programación, entre otros extras que incluye, te facilitan mucho el trabajo.

Una de las plantillas que más tiempo me ahorró al momento de realizar las interfaces para los formularios que se utilizan a lo largo de todo el proyecto que desarrollé, fue incluir una plantilla para un formulario. Esta plantilla recibe una lista con los elementos que componen al formulario y utiliza un ‘for loop’ para iterar sobre ellos. Luego, con un ‘if statements’ verifico si es una entrada de texto, o un botón para subir archivos, y dependiendo de esto va creando tu formulario. Finalmente, utilizo un ‘include’ para agregarlo a la plantilla de la interfaz que yo deseo.

Esta clase de herramientas que Django te brinda va haciendo todo más sencillo, y te permite ahorrarte tiempo de desarrollo al reutilizar código en distintas partes del proyecto.

Base de datos

Personalmente me gusta mucho la manera en la que Django interactúa con la base de datos. Primero que nada, tiene una muy buena integración con la mayoría de las bases de datos que se utilizan hoy en día. Además, te permite trabajar de una manera en la que no trabajas realmente con la base de datos, sino que tú solo te encargas de desarrollar en Python, y Django se encarga de lo demás. En todo el proyecto, no desarrollé ni una sola línea en SQL.

Toda la configuración sobre la base de datos, como el charset, o el tipo de dato a utilizar se lo dejas a Django. Y en caso de que requieras algo muy específico, también puedes indicarlo en el archivo de configuración del proyecto.

Algo que me gustó mucho, es el crear modelos en vez de crear tablas. Al crear tablas muchas veces no estamos seguros de qué tipo de dato utilizar dependiendo de la información que almacenaremos, o te pueden llegar a surgir dudas sobre cómo realizar tus relaciones, entre otras cosas que suceden al diseñar tus tablas si tienes poca experiencia. Esto ya no es un problema. En Django el crear modelos es algo muy sencillo, y solo requiere que pienses qué campos tendrá cada objeto. Y esto tiene una perfecta integración en el resto del proyecto. Por lo que si declaras un modelo con un campo de fecha, verás que a lo largo del proyecto se le trata como a una fecha, por ejemplo, al crear un formulario.

Otra herramienta que Django proveé es el ORM (Object Relational Mapping). Esto es básicamente una manera de interactuar con la base de datos. Lo que Django hace es abstraerla, de manera que no interactúes con ella con consultas SQL como lo harías normalmente, sino que la manipulas como si fuera un objeto. Un ejemplo.

Consulta SQL:

SELECT * FROM Usuarios

Consulta con ORM de Django:

Usuarios.objects.all()

Personalmente, me gusta mucho esta manera de interactuar con la base de datos. En efecto, esto tiene repercusiones en cuanto a la velocidad y el desempeño de tu proyecto, comparado con uno que utiliza SQL puro. Pero realmente, la diferencia es mínima, y a menos que realizes un proyecto que necesite un performance excesivamente efectivo, no será algo que te afecte.

Sin embargo, para situaciones donde realmente no quieres trabajar con ORM, también tienes la posibilidad de trabajar con SQL puro.

En lo personal, al utilizarlo en este proyecto, me facilitó mucho el trabajo utilizar el ORM al realizar consultas que en SQL requerirían JOIN’s muy complejos.

Pensamientos Finales

Django es un framework que me ha encantado desde que lo utilicé por primera vez. He disfrutado trabajar con él, y me gusta la manera en que puedo integrar Python, un lenguaje que me ha parecido muy bueno, para proyectos en web.

Realmente disfruté la parte del backend de PlasmaCMS, un pequeño y simple motor para blogs, que principalmente realicé como práctica de programación.

Una manera en que me gustaría trabajar a futuro con Django, es realizando una REST API, con la librería Django REST Framework. Aún no tengo pensado específicamente en qué consistirá el proyecto, pero espero poder desarrollar algo pronto, en algún tiempo libre.

Enlaces adicionales:

Espero te haya agradado este post, cualquier sugerencia o duda puedes dejarla en los comentarios o contactarme vía Twitter 🙂

Otros posts similares: