Capitulo 1 - Django y Patrones
En este capítulo, se introduce el concepto de patrones de diseño, su importancia y varias colecciones de patrones populares. Este capítulo sirve como una base para comprender cómo los patrones de diseño se aplican en el desarrollo de aplicaciones web con Django, ofreciendo un contexto histórico y teórico esencial para el resto del libro.
Se explica detalladamente donde nació el termino "Patrones de Diseño", el cual proviene de una seria de libros de Arquitectura llamada "A pattern language: Towns, Buildings, Construction", a partir de aqui, llamamos "Patron" a una serie de problemas comunes que han sido solucionados y perfeccionados con el tiempo.
Capitulo 2 - Diseño de Aplicaciones
Este capitulo se enfoca en las etapas iniciales del ciclo de vida de una aplicación. Comienza destacando la importancia de comprender y recopilar adecuadamente los requisitos de un proyecto, un paso fundamental para el éxito de cualquier aplicación. Este proceso incluye la creación de mock-ups o prototipos iniciales, que son esenciales para visualizar y planificar la funcionalidad y el diseño de la aplicación.
El autor también aborda cómo dividir un proyecto en aplicaciones modulares, una práctica clave en Django que ayuda a mantener el código organizado y facilita el mantenimiento y la escalabilidad. Esta aproximación modular no solo es esencial para el desarrollo eficiente en Django, sino que también ilustra cómo aplicar principios de diseño de software en un entorno de desarrollo web real.
Capitulo 3 - Modelos
Este capitulo se centra en los "patrones estructurales" en Django, abordando cómo se implementan estos patrones en el código fuente de Django.
Modelos Normalizados
La normalización en el contexto de los modelos Django se refiere a la práctica de estructurar los modelos de base de datos de manera eficiente para reducir la redundancia de datos y mejorar la integridad.
Django fomenta el uso de modelos normalizados mediante relaciones entre tablas (como relaciones uno a uno, uno a muchos y muchos a muchos). La normalización ayuda a mantener la base de datos limpia y facilita las operaciones de consulta y actualización.
Model Mixins
Los mixins son una forma de componer clases sin recurrir a la herencia múltiple. Permiten reutilizar código y agregar funcionalidad a las clases de manera modular.
En Django, los mixins se pueden utilizar para agregar campos y métodos comunes a varios modelos. Esto promueve la reutilización del código y reduce la duplicación, siguiendo el principio DRY (Don't Repeat Yourself).
Perfiles de Usuario
Los perfiles de usuario son una extensión del modelo de usuario integrado en Django. Permiten almacenar información adicional sobre los usuarios que no se incluye en el modelo de usuario por defecto.
Este patrón se implementa a menudo creando un modelo adicional que tiene una relación uno a uno con el modelo de usuario. Esto permite una gran flexibilidad para agregar campos y métodos específicos del perfil del usuario.
Objetos de Servicio
Los objetos de servicio son una técnica de diseño en la que se encapsula la lógica de negocio en clases de servicio en lugar de modelos o vistas.
En Django, los objetos de servicio ayudan a mantener el código de los modelos y las vistas limpio y enfocado en su propósito principal (representar la estructura de datos y manejar la lógica de presentación, respectivamente). La lógica de negocio, como las operaciones complejas o las transacciones, se maneja en clases de servicio dedicadas, mejorando la organización del código y la mantenibilidad.
Property Field
En Python, una propiedad es una manera de proporcionar acceso controlado a los atributos de una clase. Se utilizan para definir métodos en una clase que se comportan como atributos, pero que pueden incluir lógica adicional que se ejecuta al acceder o modificar estos "atributos".
Los campos de modelo en Django son los atributos que definen la estructura de los datos en la base de datos. Cada campo en un modelo representa una columna en la tabla de base de datos correspondiente.
Capitulo 8 - Trabajo Asincrono
En este capitulo se explican 3 patrones de diseño asíncronos como "Endpoint Callback", "Publish-subscribe" y "Polling", que son fundamentales para entender cómo Django maneja operaciones asíncronas. Estos patrones subyacen a herramientas específicas como Celery, Asyncio y Channels. Cada uno de estos patrones y herramientas ofrece una solución única para mejorar la escalabilidad y eficiencia de aplicaciones web, permitiendo a los desarrolladores manejar mejor las solicitudes de usuarios y la comunicación entre cliente-servidor.
Endpoint Callback: Es cuando un servicio notifica a otro sistema una vez que una tarea se ha completado (mayormente conocidos como "webhooks" utilizados en muchas pasarelas de pago), permitiendo una comunicación asíncrona entre sistemas.
Publish-subscribe: es un patrón en el cual los mensajes son enviados por "publicadores" a canales sin conocer a los "suscriptores", permitiendo que cualquier suscriptor interesado en esos mensajes los reciba. Este patrón es parte de una arquitectura utilizada por Celery.
Polling: implica que un cliente realiza solicitudes periódicas a un servidor para verificar si hay nuevos datos disponibles, siendo útil en escenarios donde la comunicación en tiempo real no es crítica pero se desea mantener actualizada la información. Un ejemplo es cuando se consulta el estado de una instancia en Amazon a través de múltiples peticiones.
Celery: Es una biblioteca de Django que permite la ejecución de tareas asíncronas y en cola. Permite programar tareas que pueden ejecutarse en segundo plano, como el envío de correos electrónicos. Utiliza la arquitectura Pub-Sub que implementa el patrón "Publish-subscribe". Es la forma más utilizada para tareas asincronas en Django.
Esta explicación esta en el Libro.
Asyncio: Es una biblioteca de Python para escribir código concurrente utilizando la sintaxis async/await. En Django, se utiliza para manejar operaciones I/O de manera asíncrona, mejorando
Channels: Permite manejar conexiones a WebSockets y otras operaciones asíncronas en "tiempo real."
Capitulo 9 - Creando API's
Este capitulo enseña de forma muy concisa y rapida lo que es Django REST framework y como aplica el principio de "RESTful APIs. Menciona 2 patrones de Diseño que sirven al momento de crear APIs:
Human Browsable Interface: Se refiere a la creación de interfaces de API que son fácilmente navegables y comprensibles por humanos, usualmente a través de una interfaz web. Esto mejora la accesibilidad y la usabilidad de la API para desarrolladores y otros usuarios.
Infinite Scrolling: Es la implementación de una técnica de desarrollo en la que los datos se cargan dinámicamente a medida que el usuario se desplaza por la página (paginación), lo cual es útil para manejar grandes cantidades de datos sin sobrecargar el navegador o el servidor.
Capitulo 10 - Legacy Code
De este capitulo, lo que más me pareció interesante fue el uso de la biblioteca "django-command-extensions" que permite generar un diagrama de entidad-relacion de los modelos de proyecto que estemos manejando.
Segun el libro, ejecutando el comando graph models
podemos visualizar el diagrama, lo que nos permitira reestructurar los modelos segun sea necesario.
Capitulo 11 - Pruebas y Depuración
Este capitulo se enfoca en las pruebas y la depuración en Django. Menciona herramientas y técnicas para realizar pruebas efectivas y depurar aplicaciones, incluyendo el desarrollo guiado por pruebas (TDD), el uso de simulaciones (mocking), técnicas de registro (logging) y herramientas de depuración. Proporciona consejos y estrategias prácticas para garantizar que las aplicaciones Django sean robustas y fáciles de mantener.
TDD (Test-Driven Development): Es una metodología de desarrollo de software donde se escriben pruebas antes del código que las hará pasar. Este enfoque enfatiza la creación de especificaciones claras y testables antes de escribir el código funcional.
Mocking: Es una técnica utilizada en pruebas donde se simulan partes del sistema para aislar y enfocar las pruebas en componentes específicos. Ayuda a probar partes del código en un entorno controlado.
Logging: se refiere al proceso de grabar eventos y datos operativos de una aplicación. Proporciona una manera de rastrear el comportamiento de una aplicación, facilitando la depuración y el monitoreo del rendimiento y errores. De este se ha hablado en los meetups realizados: https://github.com/pycun/pycun-22/tree/master/secretos-y-estrategias-loggin-django
Algo que podria ayudar al proceso de desarrollo y pruebas es el uso de la biblioteca: https://django-extensions.readthedocs.io/en/stable/runserver_plus.html
Esta biblioteca te permite visualizar el valor de las variables al momento en el que el proceso falló.