Regístrate para acceder a más de 15 cursos gratuitos de programación con un simulador

Servidor web Python: Desarrollo web con Flask

En esta lección vamos a entender por qué necesitamos un servidor web y cómo se da la comunicación entre dos computadoras a través de la red.

Vamos a ir paso a paso, como si estuviéramos conversando con un amigo que ya tiene algo de experiencia con Python, pero apenas está explorando cómo funcionan los servidores y la red.


Procesos en la computadora

Antes de hablar de redes, hay que entender un concepto muy importante en cualquier sistema operativo: los procesos.

El proceso es una instancia en ejecución de un programa. Cada vez que ejecutas una aplicación, el sistema operativo crea un proceso separado para ella.

Por ejemplo:

  • Tu navegador web tiene un proceso por cada pestaña.
  • Si abres dos editores de texto, cada uno tiene su propio proceso.

Esto significa que si una pestaña del navegador se cuelga, las otras pueden seguir funcionando bien, porque cada una es independiente.

¿Y qué hay dentro de un proceso?

Un proceso puede tener varios hilos (threads), que son subprocesos que permiten realizar múltiples tareas al mismo tiempo dentro del mismo proceso.

Lista de procesos

Si estás en Linux, puedes ver los procesos en ejecución con los comandos:

ps aux
top

¿Cómo se comunican dos computadoras?

Cuando dos computadoras se comunican por la red, realmente no se están conectando “entre sí” como un todo, sino que lo que hacen es conectar un proceso en una computadora con otro proceso en otra. O sea, la comunicación es entre programas.

Por ejemplo:

  • Un navegador (cliente) quiere mostrar una página web.
  • Ese navegador se conecta a otro programa (servidor web) en otra máquina, que tiene la información del sitio.
El servidor es un programa que espera conexiones externas. Escucha peticiones desde la red y responde. Se dice que “escucha un socket de red” (eso lo explicamos enseguida).

El navegador sería en este caso el cliente, porque es quien inicia la conexión.

¿Con qué se conectan?

Para que esta conexión se realice, se utilizan dos datos clave:

Parámetro Qué representa
IP Dirección de la computadora en la red
Puerto Número que identifica el proceso que escucha

Cuando un programa quiere permitir conexiones, “abre un puerto” en una interfaz de red. El sistema operativo se encarga de que los mensajes que lleguen a ese puerto se envíen al proceso que lo está escuchando.

Por ejemplo:

  • Un servidor web normal que usa HTTP escucha en el puerto 80
  • Uno que usa HTTPS escucha en el puerto 443

Esto lo sabe tu navegador, por eso cuando escribes http:// o https://, él automáticamente sabe qué puerto usar. Pero en desarrollo local es normal usar otros puertos, como el 3000 o el 4000:

http://localhost:3000

¿Qué es un servidor web?

El servidor web es un programa especializado en atender solicitudes de sitios web.
  • Recibe un mensaje del navegador
  • Lo pasa al código del sitio (por ejemplo, una aplicación en Python)
  • Recoge la respuesta (HTML, JSON, etc.)
  • Se la devuelve al navegador

Además, puede hacer otras cosas útiles como:

  • Guardar resultados en caché
  • Reescribir URLs
  • Servir archivos estáticos (imágenes, CSS, JS)
  • Balancear carga entre varios servidores (cuando hay mucho tráfico)
  • Hacer de proxy inverso

Y lo mejor de todo: el servidor web no necesita saber en qué lenguaje está hecho el sitio. Existe un estándar para que puedan comunicarse.


¿Cómo se conectan el servidor web y tu sitio en Python?

CGI: el primer intento

El primer estándar fue CGI(Common Gateway Interface). La idea era simple:

  • Cuando llega una solicitud, el servidor ejecuta un script (un archivo ejecutable)
  • Le pasa variables del entorno con los datos del request
  • El script devuelve un texto con la respuesta HTTP por la salida estándar (stdout)

Resumen del flujo:

  1. El navegador pide una página
  2. El servidor prepara las variables del entorno
  3. Ejecuta tu script y le pasa los datos
  4. Tu script procesa el pedido y genera una respuesta (HTML u otro formato)
  5. El servidor recoge la salida del script
  6. Se la devuelve al navegador

El problema principal con CGI es que cada vez que llega una solicitud, se vuelve a ejecutar el script desde cero. Esto puede volver todo muy lento.


WSGI: una mejor forma para Python

Para resolver los problemas de CGI, la comunidad Python diseñó un estándar más eficiente: WSGI (Web Server Gateway Interface).

Puedes leer el estándar completo en su PEP oficial: PEP 3333

En lugar de ejecutar un script cada vez, con WSGI se define una función en Python que el servidor web va a invocar directamente cada vez que llegue una solicitud.

Esa función recibe dos cosas:

  • Un diccionario environ con la información del request
  • Una función start_response() que usas para definir el estado y los headers

Aquí tienes un ejemplo básico de una aplicación WSGI:

def app(environ, start_response):
    data = b"Hola Mundo!\n"
    start_response("200 OK", [
        ("Content-Type", "text/plain"),
        ("Content-Length", str(len(data)))
    ])
    return iter([data])

¿Qué hace esto?

  • Define el estado 200 (OK)
  • Indica que el contenido es texto plano
  • Devuelve la frase “Hola Mundo!” como respuesta

💡 En este caso, app es un callable (algo que se puede llamar como una función). Todos los frameworks modernos lo implementan así.

Por ejemplo:

Framework Objeto WSGI
Flask app
Django get_wsgi_application()

Servidores y herramientas comunes

Veamos un resumen de las herramientas más usadas tanto para desarrollo como para producción:

Herramienta Tipo Para qué sirve
nginx Servidor web Muy rápido y confiable. Ideal para producción.
Caddy Servidor web Fácil de configurar. Hace muchas cosas “solo”.
gunicorn Servidor WSGI en Python Ejecuta tus apps en producción. Ligero y útil.

Por lo general, no se usa gunicorn de forma directa en internet. Se suele poner detrás de nginx o Caddy, que se encargan del tráfico externo, los certificados HTTPS, etc.

Un esquema común es:

Usuario -> nginx -> gunicorn -> Tu app Django/Flask

Resumen

  • Un proceso es una unidad de ejecución en la computadora. Cada programa que usas es al menos un proceso.
  • La comunicación en red se da entre procesos de diferentes computadoras.
  • Un servidor escucha en un puerto y espera conexiones. Un cliente (como un navegador) se conecta a él para obtener una respuesta.
  • El servidor web recibe las solicitudes del navegador y las pasa a tu aplicación web.
  • CGI fue el primer estándar, pero WSGI es más eficiente y el más usado en Python hoy en día.
  • En WSGI, defines una función (callable) que recibe la solicitud y devuelve la respuesta.
  • Frameworks como Flask y Django ya implementan WSGI.
  • gunicorn es el servidor WSGI más usado en Python, y se suele usar junto con nginx o Caddy para producción.

Trabajo independiente

  1. Guarda el código de la aplicación WSGI en un módulo llamado example.py.
  2. Instala gunicorn. Siempre instala todo en un entorno virtual.
  3. Puedes crearlo con cualquier herramienta.
  4. Inicia el módulo con el comando gunicorn -w 4 example:app: con este comando iniciamos el servidor WSGI gunicorn y le indicamos la ruta a nuestra función de aplicación.
  5. Va al navegador a la dirección que aparece en la salida y observa el resultado.

Materiales adicionales

  1. Sockets de red 📚 Wikipedia
  2. WSGI 📚 Wikipedia

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.

Obtener acceso
130
cursos
1000
ejercicios
2000+
horas de teoría
3200
test

Obtén acceso

Cursos de programación para principiantes y desarrolladores experimentados. Comienza tu aprendizaje de forma gratuita

  • 130 cursos, 2000+ horas de teoría
  • 1000 ejercicios prácticos en el navegador
  • 360 000 estudiantes
Al enviar el formulario, aceptas el «Política de privacidad» y los términos de la «Oferta», y también aceptas los «Términos y condiciones de uso»

Nuestros graduados trabajan en empresas como:

Bookmate
Health Samurai
Dualboot
ABBYY