- ¿Qué es WSGI?
- Paso 1: Crear la aplicación web
- Paso 2: Crear el servidor
- Paso 3: Ejecutar el servidor
- Paso 4: Probar la aplicación
- Problemas comunes
- Hacer cambios en caliente
- Comparación con servidores reales
Ya llevas un buen camino con Python, así que vas a ver algo nuevo y muy útil: cómo crear un servidor web básico usando solo Python puro, sin instalar herramientas externas. Para esto vamos a usar un módulo llamado wsgiref, que viene incluido en la biblioteca estándar de Python.
Más adelante, en proyectos reales, otras herramientas como Gunicorn o uWSGI son más comunes, pero con wsgiref tenemos suficiente para entender cómo funciona todo desde cero.
¿Qué es WSGI?
Antes de empezar, hablemos un momento de qué es WSGI.
Piensa en WSGI como un puente entre el servidor (que recibe las peticiones del navegador) y tu código Python (que responde esas peticiones).
Paso 1: Crear la aplicación web
Primero vamos a escribir un archivo llamado example.py. Este será nuestro "programa web", es decir, el código que será ejecutado cada vez que el navegador haga una solicitud.
Contenido de example.py
from datetime import datetime
# Esta es nuestra aplicación WSGI
def app(environ, start_response):
time = datetime.now() # Obtenemos la hora actual
data = bytes(f'The time is {time:%H:%M:%S}', 'utf-8') # Convertimos a bytes
# Le decimos al servidor que todo salió bien (200 OK)
start_response("200 OK", [
("Content-Type", "text/plain"), # Tipo de contenido: texto plano
("Content-Length", str(len(data))) # Tamaño de la respuesta
])
return [data] # Devolvemos la respuesta
¿Qué hace este código?
- Define la función
app, que es la interfaz entre el servidor y tu aplicación. - Usa el módulo
datetimepara conseguir la hora actual. - Devuelve un mensaje con ese dato como respuesta HTTP.
Paso 2: Crear el servidor
Ahora vamos a configurar el servidor que usará esa aplicación. Crea otro archivo llamado server.py.
Contenido de server.py
from wsgiref.simple_server import make_server
from example import app # Importamos la aplicación que creamos
def server(wsgi_app):
# Creamos el servidor en el puerto 8000 (localhost por defecto)
serverd = make_server('', 8000, wsgi_app)
print("Serving HTTP on port 8000...")
serverd.serve_forever() # El servidor queda "esperando" solicitudes
if __name__ == '__main__':
server(app)
Al ejecutar este archivo, se levantará el servidor web en el puerto 8000 y quedará esperando peticiones.
Paso 3: Ejecutar el servidor
Para levantar el servidor, abre una terminal y ejecuta:
python3 server.py
Verás algo como:
Serving HTTP on port 8000...
Mientras el servidor esté corriendo, la terminal no responderá a otros comandos, porque está "ocupada" procesando solicitudes. Para detenerlo, puedes presionar Ctrl+C.
Paso 4: Probar la aplicación
Abre tu navegador y visita esta dirección:
http://localhost:8000
Ahí deberías ver algo como:
The time is 15:42:36
Cada vez que recargues, te mostrará la hora actualizada.
En la terminal, verás una línea por cada solicitud recibida, como esta:
127.0.0.1 - - [08/Sep/2022 14:08:39] "GET / HTTP/1.1" 200 20
Problemas comunes
❌ Si intentas abrir otro servidor en el mismo puerto (por ejemplo, en otra pestaña de la terminal), verás un error como este:
OSError: [Errno 98] Address already in use
Esto significa que el puerto 8000 ya está ocupado. Puedes:
- Detener el servidor con Ctrl+C
- O usar otro puerto disponible (por ejemplo, 8001)
Para saber qué proceso está usando el puerto 8000, puedes ejecutar este comando en la terminal:
ss -ltnup 'sport = :8000'
Hacer cambios en caliente
Supongamos que ahora quieres mostrar no solo la hora, sino también la fecha. Puedes modificar example.py así:
data = bytes(f'The time is {time:%b %d %H:%M:%S}', 'utf-8')
Pero, cuando actualizas la página en el navegador, no verás los cambios. ¿Por qué?
Porque el servidor solo carga tu aplicación una vez, cuando arranca. Para que los cambios se reflejen, debes detener el servidor y volver a iniciarlo.
Algunos frameworks como Flask o Django incluyen un "dev server" que se reinicia automáticamente; pero este no. Más adelante veremos cómo usar esas herramientas.
Comparación con servidores reales
| Herramienta | ¿Viene con Python? | Uso recomendado |
|---|---|---|
| wsgiref | Sí | Educación, pruebas |
| Gunicorn | No | Aplicaciones reales |
| uWSGI | No | Escenarios avanzados |
Los grandes servidores como Gunicorn y uWSGI permiten ejecutar tu código como "demonios", es decir, procesos que corren en segundo plano incluso cuando cierras la terminal.
Resumen
wsgirefes una herramienta de Python puro para crear servidores web básicos.- Definimos una aplicación WSGI como una función que recibe
environystart_response. - Usamos
make_serverpara crear el servidor y.serve_forever()para dejarlo corriendo. - Cada vez que el navegador visita
http://localhost:8000, el servidor ejecuta la función de nuestra app. - Para ver cambios en el código, debemos reiniciar el servidor.
- En producción, se usan servidores más potentes como Gunicorn o uWSGI.
- Si el puerto está ocupado, el servidor no podrá iniciarse.
Este es un paso clave para entender cómo funcionan las aplicaciones web por "debajo del capó". Más adelante, vas a ver cómo frameworks como Flask te facilitan mucho todo esto, pero entender lo básico te dará muchas ventajas.
Trabajo independiente
- Repite todos los pasos de esta lección
Materiales adicionales
Para acceder completo a curso necesitas un plan básico
El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.