En la era digital actual, la necesidad de sistemas de votación seguros y transparentes nunca ha sido tan crítica. Ya sea para elecciones organizacionales, encuestas comunitarias o procesos electorales gubernamentales, contar con una plataforma de votación electrónica confiable puede agilizar el proceso, mejorar la seguridad y garantizar resultados precisos. Es por eso que me propuse crear un Sistema de Votación Electrónica Seguro y Eficiente, basado con con el framework de Python FastAPI, Jinja2 y Tailwind CSS.
Este proyecto enfatiza la simplicidad, la seguridad y la facilidad de uso, convirtiéndolo en una solución perfecta para diversas necesidades de votación. Puedes encontrar el proyecto publicado en: https://github.com/joakimvivas/electronic-voting-system
Tabla de Contenidos
- ¿Por Qué Crear un Sistema de Votación Electrónica?
- Tecnologías Utilizadas
- Características Principales
- Estructura del Proyecto
- Cómo Empezar
- Creación de una Votación
- Panel de Administración
- Emisión de Votos
- Registro de Auditoría
- Manejo de Errores Amigable
- Conclusión
¿Por Qué Crear un Sistema de Votación Electrónica?
Los métodos de votación tradicionales, aunque confiables, vienen con desafíos como la accesibilidad, la velocidad y el potencial de error humano. Un sistema de votación electrónica aborda estos problemas al:
- Mejorar la Accesibilidad: Permitir que los votantes emitan sus votos desde cualquier lugar.
- Aumentar la Eficiencia: Contabilizar rápidamente los votos y entregar resultados.
- Mejorar la Seguridad: Utilizar encriptación y autenticación basada en tokens para prevenir fraudes.
- Garantizar la Transparencia: Mantener registros de auditoría completos para la responsabilidad.
Al aprovechar las tecnologías web modernas, podemos construir un sistema que sea tanto robusto como fácil de usar.
Tecnologías Utilizadas
- FastAPI: Un moderno y rápido framework web para construir APIs con Python 3.6+ basado en estándares de tipado de Python.
- Jinja2Templates: Un motor de plantillas para Python que permite renderizar contenido dinámico en HTML.
- Tailwind CSS: Un framework CSS de utilidad primero para construir rápidamente interfaces de usuario personalizadas.
- Cryptography: Un paquete utilizado para encriptar y desencriptar datos de votación, asegurando la confidencialidad de la información.
- UUID: Para generar identificadores únicos para votaciones y tokens.
Características Principales
- Votación Segura: Cada voto está vinculado a un token único, asegurando un voto por votante.
- Almacenamiento de Datos Encriptados: Los datos de votación se almacenan en archivos encriptados, protegiendo la información sensible.
- Panel de Administración: Los administradores pueden crear votaciones, añadir o eliminar votantes y monitorear registros de auditoría.
- Interfaz Amigable: Diseño limpio y responsivo utilizando Tailwind CSS.
- Registros de Auditoría Completos: Cada acción (creación de votación, añadir votante, eliminar votante, emitir voto) se registra con marcas de tiempo.
- Manejo de Errores Amigable: Páginas de error personalizadas en lugar de respuestas JSON crudas para mejorar la experiencia del usuario.
Estructura del Proyecto
A continuación puedes descubrir la estructura del proyecto, que iré mejorando con el tiempo, ya que está en una fase muy inicial.
main.py
: Archivo principal que contiene la lógica de la aplicación.templates/
: Carpeta que almacena todas las plantillas HTML renderizadas por Jinja2.utils/
: Contiene módulos para operaciones de encriptación, manejo de archivos y gestión de índices de tokens.images/
: Imágenes utilizadas en el blog y en la documentación del proyecto.requirements.txt
: Lista de dependencias necesarias para ejecutar el proyecto.
Cómo Empezar
A continuación tienes las intrucciones para clonar el repositorio de GitHub y arrancar el proyecto, si tu intención es hacerlo mediante Docker, en el fichero Readme del proyecto encontrarás las instrucciones.
1. Clonar el Repositorio
Para iniciar, tienes que clonar el repositorio y puedes hacerlo a partir de los siguientes commands:
git clone https://github.com/joakimvivas/electronic-voting-system.git
cd electronic-voting-system
2. Instalar las Dependencias
Asegúrate de tener Python 3.6+ instalado. Luego, instala las dependencias necesarias:
pip install -r requirements.txt
3. Iniciar el Servidor
Ejecuta el servidor FastAPI utilizando Uvicorn:
uvicorn app.main:app --reload --port 3000 --host 0.0.0.0
4. Abrir la Aplicación
Visita http://localhost:3000/
en tu navegador para comenzar a crear una nueva votación.
Creación de una Votación
Al acceder a la raíz del proyecto (http://localhost:3000/
), encontrarás un formulario sencillo que te permite crear una nueva votación. Los campos incluyen:
- Título: Nombre de la votación.
- Opciones: Opciones de voto separadas por comas (por ejemplo, “Opción A, Opción B”).
- Entidad: Nombre de la organización, empresa u otra entidad que realiza la votación.
- Logotipo: URL de una imagen que representará a la entidad en la página de votación.
Después de completar el formulario y enviarlo, se generará un ID de votación único y una Clave de Administración que te permitirán gestionar la votación desde el panel de administración.
Panel de Administración
El panel de administración se accede a través de la URL /admin_panel?voting_id={ID_VOTACIÓN}&key={CLAVE_ADMINISTRACIÓN}
. En este panel, los administradores pueden ver:
- Ver Detalles de la Votación: Título, entidad y logotipo.
- Ver Opciones de Voto: Listado de opciones disponibles y el conteo actual de votos.
- Añadir Votantes: Formularios para añadir nuevos votantes mediante su email.
- Eliminar Votantes: Botones para eliminar votantes que aún no han votado.
- Ver Historial de Auditoría: Acceso a registros detallados de todas las acciones realizadas.
Emisión de Votos
Los votantes acceden a la página de votación mediante un enlace único que incluye su token: /votar?token={TOKEN}
. En esta página, verán:
- Logotipo de la Entidad: Imagen representativa de la organización.
- Título de la Votación: Nombre de la votación.
- Opciones de Voto: Lista de opciones disponibles para elegir.
- Botón de Votar: Botón para emitir su voto.
Una vez que el votante selecciona una opción y emite su voto, se actualiza el conteo de votos y se registra la acción en los logs de auditoría. El sistema no permitirá volver a votar al mismo usuario, mostrándole un aviso.
Registro de Auditoría
Cada acción realizada en el sistema se registra con una marca de tiempo, lo que permite mantener un historial completo de todas las actividades. Esto incluye:
- Creación de una votación
- Añadir Votante
- Eliminar Votante
- Emitir Voto
El registro de auditoría se puede ver en la página /admin_audit?voting_id={ID_VOTACIÓN}&key={CLAVE_ADMINISTRACIÓN}
.
Manejo de Errores Amigable
Para mejorar la experiencia del usuario, el sistema incluye páginas de error personalizadas que reemplazan las respuestas JSON por defecto. Por ejemplo, si un usuario intenta acceder a una ruta con un método no permitido (como hacer un GET a /emitir_voto
que solo acepta POST), verá una página de error amigable en lugar de un mensaje JSON crudo.
Conclusión
Crear un sistema de votación electrónica seguro y eficiente es una tarea que requiere atención a la seguridad, la usabilidad y la transparencia. Utilizando FastAPI para el backend, Jinja2Templates para el renderizado de plantillas y Tailwind CSS para un diseño responsivo y atractivo, hemos construido una solución que aborda estos aspectos de manera efectiva.
Éste proyecto no solo facilita la creación y gestión de votaciones, sino que también asegura que cada voto sea único y seguro, proporcionando a los administradores herramientas robustas para monitorear y auditar todo el proceso.
Sinceramente, todavía falta mucho para que éste sea un proyecto robusto, está en su fase inicial y querría invitarte ayudarme a construirlo, es por eso que te invito a explorar el repositorio en GitHub para ver el código completo, contribuir o simplemente probar el sistema por ti mismo. ¡Construyamos juntos un futuro más transparente y eficiente para los procesos de votación!