2 · Flask: tu primera app
Flask es un framework web diminuto y legible: `Flask(__name__)` crea la app, `@app.route("/")` mapea una URL a una función, y el valor de retorno de la función se vuelve la respuesta. Con unas pocas líneas y `app.run(debug=True)` tienes un servidor vivo que puedes visitar en un navegador.
Flask mapea URLs a funciones de Python: `app = Flask(__name__)` crea la app, el decorador `@app.route("/ruta")` registra un manejador para esa URL, y lo que el manejador RETORNA se vuelve el cuerpo de la respuesta (un string → HTML, un dict → JSON). `app.run(debug=True)` arranca un servidor de desarrollo con auto-recarga y páginas de error en el navegador.
Sin esto:
Sin un framework escribirías a mano código crudo de sockets y parseo de HTTP para cada ruta; Flask colapsa todo eso en un decorador por URL.
Ahora que conoces el ciclo petición/respuesta, vamos a montar uno. Flask es un framework web mínimo de Python — lo bastante pequeño para leerlo en una tarde, lo bastante potente para servir APIs de ML reales. Todo el modelo mental es: mapea una URL a una función, retorna un valor, y Flask maneja el HTTP.
Crea la app. app = Flask(__name__) construye el objeto de aplicación. El argumento __name__ le dice a Flask dónde vive la app (en qué módulo) para que pueda encontrar plantillas y archivos estáticos relativos a tu código. Crearás exactamente un app por proyecto.
Las rutas mapean URLs a funciones. El decorador @app.route("/") dice "cuando llegue una petición para esta URL, llama a la función de abajo". La función es el manejador (también llamado función de vista). Su valor de retorno se vuelve el cuerpo de la respuesta:
- Retorna un string → Flask lo envía como HTML con un
200 OK.return "Hola!"literalmente renderiza "Hola!" en el navegador. - Retorna un dict → Flask lo serializa a JSON automáticamente y fija el
Content-Typecorrecto.return {"status": "ok"}envía{"status":"ok"}como JSON. (Esta es la semilla de la API de predicción que construirás el próximo capítulo.)
Los parámetros de URL capturan partes de la ruta. Una ruta como @app.route("/user/<int:user_id>") captura un número de la URL y lo pasa a tu función como argumento. Una petición a /user/42 llama a profile(user_id=42). El convertidor <int:...> tanto extrae el valor como impone su tipo — /user/abc no emparejará con una ruta int en absoluto (Flask devuelve 404), así que las rutas malas nunca llegan a tu código.
El servidor de desarrollo + modo debug. app.run(debug=True) arranca el servidor de desarrollo integrado de Flask, típicamente en http://127.0.0.1:5000. debug=True es tu amigo mientras construyes: auto-recarga el servidor cada vez que guardas un archivo (sin reinicio manual), y muestra un traceback rico e interactivo en el navegador cuando algo falla — en lugar de un "500" en blanco ves la línea exacta que se rompió.
Una advertencia crítica: debug=True y el servidor integrado son solo para desarrollo. El depurador expone una consola interactiva que un atacante podría explotar, y el servidor de desarrollo no está hecho para carga real. En producción apagas debug y corres detrás de un servidor WSGI real como gunicorn (cubierto más adelante en esta pista / la pista de MLOps).
Las dos celdas de solo-lectura de abajo muestran una app mínima completa y el comando que la ejecuta.
Una app de Flask mínima completa: `Flask(__name__)`, tres rutas (string → HTML, dict → JSON, un parámetro de URL `<int:user_id>`), y `app.run(debug=True)`.
Instala Flask y arranca el servidor de desarrollo — ya sea `python app.py` o `flask --app app run --debug` — luego abre `http://127.0.0.1:5000` en un navegador.
En Flask, ¿qué hace el decorador `@app.route("/predict")`?
- `app = Flask(__name__)` crea la aplicación, y el decorador `@app.route("/ruta")` mapea una URL a una función manejadora.
- El valor de retorno de un manejador se vuelve el cuerpo de la respuesta: un string se envía como HTML, un dict se auto-serializa a JSON; los convertidores `<int:id>` capturan y verifican el tipo de los parámetros de URL.
- `app.run(debug=True)` arranca el servidor de desarrollo con auto-recarga y tracebacks en el navegador — SOLO para desarrollo; apaga debug y usa un servidor WSGI real en producción.
El objeto app de Flask y los manejadores `@app.route` son el esqueleto del que cuelga toda API de modelo — el endpoint `/predict` que construyes el próximo capítulo es solo una ruta más que retorna un dict.
Si lo quitas: Sin el enrutamiento de Flask estarías parseando HTTP crudo a mano para cada endpoint; el framework es lo que te deja enfocarte en la predicción en vez de en la fontanería.