Módulo 0 · Puesta a punto

Lección 00 — Entorno y primer endpoint

Django + DRF en Linux, estructura del proyecto y primer endpoint de salud con Git desde el minuto uno.

Publicada
En esta lección
  1. Objetivos
  2. 1. Instalación del stack (Linux)
  3. 2. Crear el proyecto TicketFlow
  4. 3. Tu primer endpoint
  5. 4. Git desde el minuto uno
  6. Cierre de la lección

Stack: Python 3.12+ · Django 5.x · Django REST Framework · Linux Estado: Dominada (marcada al completar la puesta a punto)


Objetivos

Al terminar esta lección sabrás:

  1. Instalar y aislar las herramientas del stack en Linux.
  2. Crear un proyecto Django + DRF con buena estructura desde el minuto uno.
  3. Levantar tu primer endpoint y comprobarlo con curl.
  4. Inicializar Git con un .gitignore adecuado a Python.
  5. Conocer la estructura de trabajo del curso: teoría → ejercicios → corrección → proyecto.

1. Instalación del stack (Linux)

bash
# Comprueba tu versión de Python (necesitas 3.12+)
python3 --version

# Crea el directorio del proyecto y un entorno virtual aislado
mkdir -p ~/dev/ticketflow && cd ~/dev/ticketflow
python3 -m venv .venv
source .venv/bin/activate        # tu prompt mostrará (.venv)

# Instala Django y DRF
pip install --upgrade pip
pip install django djangorestframework

# Congela las dependencias (siempre, desde el principio)
pip freeze > requirements.txt

Por qué venv: cada proyecto tiene sus propias dependencias y versiones. Sin aislamiento, dos proyectos pueden pelearse por la versión de una librería. Esto es la semilla de la Lección 27 (configuración 12-factor).

Herramientas que usaremos más adelante (instálalas ahora, tómalas con calma):

bash
sudo apt install postgresql redis-server   # Módulo 2 y 6 (BD y colas)
docker --version                            # Módulo 9

2. Crear el proyecto TicketFlow

bash
django-admin startproject config .      # ¡el punto importa!
python manage.py startapp events

Estructura resultante (y la que mantendremos):

ticketflow/
├── config/            ← configuración (settings, urls, wsgi) — el "proyecto"
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── events/            ← primera app: eventos y aforo — el dominio
│   ├── models.py
│   ├── views.py
│   └── ...
├── manage.py
└── requirements.txt

Convención de nivel empresarial: llamamos config al proyecto porque su único papel es configurar y arrancar; la lógica vive en apps. Así evitamos el clásico ticketflow/ticketflow/ confuso.

Registra DRF en config/settings.py:

python
INSTALLED_APPS = [
    # ...apps de Django por defecto...
    "rest_framework",
    "events",
]

3. Tu primer endpoint

Django puro trabaja con HttpRequest/HttpResponse; DRF añade Request/Response con negociación de contenido, serializers y auth. Para una API, viviremos en DRF.

events/views.py:

python
from rest_framework.decorators import api_view
from rest_framework.response import Response


@api_view(["GET"])
def health(request):
    """Endpoint de salud: el primero de todo backend serio."""
    return Response({"status": "ok", "service": "ticketflow"})

config/urls.py:

python
from django.contrib import admin
from django.urls import path
from events import views

urlpatterns = [
    path("admin/", admin.site.urls),
    path("api/health/", views.health),
]

Levanta el servidor y comprueba:

bash
python manage.py migrate       # crea la BD inicial (SQLite por ahora)
python manage.py runserver     # http://127.0.0.1:8000
bash
curl -i http://127.0.0.1:8000/api/health/

Salida esperada (¡fíjate en las cabeceras, son la Lección 01!):

http
HTTP/1.1 200 OK
Date: ...
Content-Type: application/json
...
{"status": "ok", "service": "ticketflow"}

4. Git desde el minuto uno

bash
git init

Crea .gitignore con este mínimo Python:

gitignore
__pycache__/
*.pyc
.venv/
db.sqlite3
.env
bash
git add .
git commit -m "chore: proyecto TicketFlow inicial (Django + DRF)"

Nunca commitees db.sqlite3 ni .env. Las claves van en variables de entorno (Lección 27); el esquema vive en migraciones, no en el fichero de BD.


Cierre de la lección

  • [ ] Stack instalado y venv funcionando
  • [ ] Endpoint /api/health/ responde 200 con JSON
  • [ ] Repositorio Git inicializado con .gitignore
  • [ ] Sabes explicar qué hace startapp frente a startproject

Ya estás listo para la Lección 01 — HTTP a fondo.