🔗 URL Shortener
Un servicio de acortador de URLs simple y eficiente, construido con Django y Django REST Framework. Este servicio permite a los usuarios acortar URLs largas, rastrear cuántas veces son accedidas y gestionar sus URLs a través de una API RESTful.

🛠️ Tecnologías Utilizadas
- Backend: Django, Django REST Framework
- Base de Datos: PostgreSQL (recomendado), SQLite (por defecto)
- Caché/Broker: Redis
- Tareas Asíncronas: Celery
- Frontend: HTML, Tailwind CSS, HTMX
✨ Características Principales
- Acortar URLs largas y recuperar las originales.
- Rastrear el número de accesos a una URL acortada.
- API RESTful para crear, obtener, actualizar y eliminar URLs.
- Autenticación de Usuario: Registro, inicio y cierre de sesión.
- URLs Específicas por Usuario: Las URLs pueden ser asociadas a usuarios autenticados.
- Permisos: Solo el propietario o un superusuario puede modificar o eliminar una URL.
- Dashboard Interactivo: Los usuarios autenticados pueden gestionar sus URLs (eliminar, cambiar contraseña, regenerar token) usando HTMX.
- Expiración de URL:
- Las URLs anónimas expiran y se eliminan después de un tiempo.
- Las URLs de usuario expiran y se marcan como inactivas.
- Tareas en Segundo Plano: Usa Celery para operaciones asíncronas como la expiración de URLs.
- Caché: Utiliza Redis como caché para mejorar el rendimiento.
🔑 Tipos de Acortadores de URL
El servicio soporta tres tipos de URLs acortadas, cada una con un mecanismo de acceso distinto:
- Acortadores sin contraseña (Públicos)
Se comportan como cualquier acortador tradicional. Al hacer clic en la URL acortada, el usuario es redirigido directamente a la URL original.
- Acortadores con Token (Privados)
Estos acortadores requieren un token de acceso para ser utilizados. El token debe ser pasado como parámetro en la URL, en formato UUID4. Por ejemplo:
/p_shorturl/?token=mitoken
. - Acortadores con Contraseña (Privados)
Para acceder a estas URLs, el usuario debe proporcionar una contraseña. El sistema redirige al usuario a un formulario de contraseña o requiere que la contraseña sea enviada a través de una petición POST. Una vez autenticado, la sesión del navegador se mantiene para futuras redirecciones.
⚙️ Instalación
- Clona el repositorio: git clone https://github.com/xeland314/urlshortener.gitcd urlshortenerbash
- Crea un entorno virtual e instala dependencias (usando `uv`): uv venvsource .venv/bin/activateuv pip install -r requirements.txtbash
- Configura variables de entorno:
Crea un archivo
.env
en la raíz del proyecto y añade:DATABASE_URL=sqlite:///db.sqlite3SECRET_KEY=your_django_secret_keyREDIS_LOCATION=redis://127.0.0.1:6379/0env - Aplica las migraciones: python manage.py makemigrations && python manage.py migratebash
- Crea un superusuario (opcional): python manage.py createsuperuserbash
- Instala dependencias de Node.js: npm installbash
- Compila Tailwind CSS: npm run build:cssbash
🚀 Ejecutando la Aplicación
Para ejecutar la aplicación completa, necesitas el servidor de Django, un servidor de Redis y los workers de Celery.
- Inicia el Servidor de Redis:
Si usas Docker:
docker run -d -p 6379:6379 redis/redis-stack-server:latestbash - Inicia el Worker de Celery:
En una nueva terminal:
celery -A urlshortener worker -l infobash - Inicia Celery Beat:
En otra terminal (para tareas programadas):
celery -A urlshortener beat -l infobash - Ejecuta el Servidor de Desarrollo de Django:
En tu terminal principal:
python manage.py runserverbash
Accede a la aplicación en http://127.0.0.1:8000/.
🧪 Pruebas Unitarias
El proyecto incluye un conjunto de pruebas exhaustivas para validar la lógica del modelo, la API y los flujos de redirección.
python manage.py test
📄 Licencia
Este proyecto está bajo la Licencia MIT.
Consulta el archivo LICENSE para más detalles.
🙏 Agradecimientos
Este proyecto se inspiró y fue guiado por el URL Shortening Service Project de roadmap.sh .