Proyectos

Remates

Página web donde las empresas rematan sus artículos y los usuarios pujan por ellos.

El proyecto está planeado para correr en Docker. Consta de una API RESTful en Flask (puerto 400) que muestra todos los entry points, un servidor que ejecuta tareas asíncronas con Celery (puerto 5555) ,un servidor WebSocket para la comunicación en tiempo real y un cliente en Vue (puerto 80).

Objetivos

Crear una pagina web funcional que me permita demostrar mis conocimientos en programación web

Características Clave
  • Comunicación en tiempo real entre servidor y cliente
  • Manejo de tareas asíncronas
Tecnologías Utilizadas

Vue.js, Vue Router, Vuex, Socket.io, Docker, Flask, Celery, Redis, MariaDB, Git.

Lenguajes

Python

Esta es la API de la página, que proporciona toda la información necesaria al cliente, en este caso, Vue. Además, se comunica con un servidor Python, con Celery, para gestionar la información de las tareas a realizar. Para el manejo de eventos en tiempo real, mediante Redis, se comunica con un servidor Socket.

El servidor está desarrollado con Flask ,lo que nos permite manejar las peticiones del cliente . Al ser una imagen de Docker, el servidor se ejecuta sobre Gunicorn.

Objetivos

Mantener una comunicación estable con diversos clientes mediante peticiones HTTP, asegurando la protección de los datos y la seguridad del usuario.

Características Clave
  • Autenticación y autorización mediante JWT para asegurar el acceso.
  • API RESTful para interacciones estandarizadas.
  • Documentación de la API generada mediante un código propio con JSON y Jinja para visualizar los endpoints.
  • Escalabilidad mediante contenedores Docker.
  • Integración con Celery para la gestión de tareas asíncronas.
  • Conexión a MariaDB para el almacenamiento de datos.
  • Uso de Redis para la comunicación entre servicios.
Tecnologías Utilizadas

Flask, Flask-SQLAlchemy, Redis, Docker, MariaDB.

Desafíos y Soluciones

Uno de los desafíos que enfrenté fue cómo hacer que los remates comenzaran a una hora determinada. Para solucionarlo, creé otro servidor con Celery que maneja estas tareas programadas. El servidor Python envía información sobre el nombre de la tarea, el momento de inicio y datos relevantes, como el UUID del remate que debe comenzar, a través de Redis. Cuando Celery completa la tarea, notifica a Python mediante peticiones HTTP usando JWT.

Además, enfrenté el reto de mantener las sesiones seguras, asegurando que pudieran ser actualizadas y cerradas en circunstancias específicas. Para abordar esto, desarrollé mi propio manejador de sesiones. Este sistema almacena la información de las sesiones en una clase, la cual contiene un diccionario con los datos de cada sesión y otro que enlaza a un usuario con todas sus sesiones. Así, cualquier modificación se refleja en todas las sesiones correspondientes.

Al agregar múltiples "trabajadores" de Gunicorn, surgió el problema que las sesiones no eran compartidas. Para ello tome la decision de guardar las sesiones en redis y que cada trabajador acceda o las modifique, pasando por barreras de Redis para tener consistencia de datos

Próximos Pasos

Planeo agregar más funcionalidades:

  • Permitir que las empresas puedan agregar empleados y sus respectivos permisos.
  • Implementar un sistema de bloqueo de personas.
  • Generar estadísticas de ventas y retiros de productos.
  • Incorporar geolocalización de las empresas.
  • Facilitar mensajería en tiempo real entre clientes y empresas.

Link del repositorio: GitHub

Link de la imagen Docker: Docker Hub