← Volver a todos los proyectos

🔗 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.

Vista previa del proyecto URL Shortener

🛠️ 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.

    Ejemplo de URL acortada con token
  • 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.

    Ejemplo de URL acortada con contraseña

⚙️ Instalación

  1. Clona el repositorio:
    git clone https://github.com/xeland314/urlshortener.git
    cd urlshortener
    bash
  2. Crea un entorno virtual e instala dependencias (usando `uv`):
    uv venv
    source .venv/bin/activate
    uv pip install -r requirements.txt
    bash
  3. Configura variables de entorno:

    Crea un archivo .env en la raíz del proyecto y añade:

    DATABASE_URL=sqlite:///db.sqlite3
    SECRET_KEY=your_django_secret_key
    REDIS_LOCATION=redis://127.0.0.1:6379/0
    env
  4. Aplica las migraciones:
    python manage.py makemigrations && python manage.py migrate
    bash
  5. Crea un superusuario (opcional):
    python manage.py createsuperuser
    bash
  6. Instala dependencias de Node.js:
    npm install
    bash
  7. Compila Tailwind CSS:
    npm run build:css
    bash

🚀 Ejecutando la Aplicación

Para ejecutar la aplicación completa, necesitas el servidor de Django, un servidor de Redis y los workers de Celery.

  1. Inicia el Servidor de Redis:

    Si usas Docker:

    docker run -d -p 6379:6379 redis/redis-stack-server:latest
    bash
  2. Inicia el Worker de Celery:

    En una nueva terminal:

    celery -A urlshortener worker -l info
    bash
  3. Inicia Celery Beat:

    En otra terminal (para tareas programadas):

    celery -A urlshortener beat -l info
    bash
  4. Ejecuta el Servidor de Desarrollo de Django:

    En tu terminal principal:

    python manage.py runserver
    bash

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
bash

📄 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 .