Python es un lenguaje tan poderoso que me sorprende constantemente. Particularmente su librería standard incluye tantas cosas maravillosas que lleva tiempo ir descubriéndolas todas.
Hoy voy a hablar de BaseHTTPServer un módulo de Python 2.x (en 3.x se llama http.server) que nos permite implementar un servidor web en muy pocas líneas de código. Es la base de otros dos módulos muy interesantes, SimpleHTTPServer y CGIHTTPServer. El primero implementa un muy simple servidor web que sirve archivos y el segundo es un servidor que ejecuta script CGI en entornos Unix.
Por ejemplo, con SimpleHTTPServer podemos hacer algo tan maravilloso como esto:
$ cd ~/musica $ python -m SimpleHTTPServer
Y con sólo eso tenemos montado un servidor web escuchando en 0.0.0.0:8000 y sirviendo todos nuestros archivos de la carpeta ~/musica.
Pero la clase BaseHTTPServer es más poderosa porque nos permite implementar nuestros propios RequestHandlers, es decir, clases que extiendan BaseHTTPRequestHandler y hagan lo que nosotros queramos en cada petición para cada método HTTP. Por ejemplo, para implementar el método GET solamente hace falta crear una clase que extienda BaseHTTPRequestHandler y sobrecargar el método do_GET.
Por ejemplo, si yo quisiera implementar un muy básico servidor que me diga el load average del sistema sería tan sencillo como poner:
# -*- coding: utf-8 -*-
import os
import sys
import BaseHTTPServer
class RequestHandler (BaseHTTPServer.BaseHTTPRequestHandler):
def do_GET (self):
self.send_response(200)
self.end_headers()
self.wfile.write(self._get_status())
return
def _get_status (self):
return "Status:\n" \
"——-\n" \
"Load average: %s\n" % \
("%01.2f, %01.2f, %01.2f" % \
os.getloadavg())
def main (args):
httpd = BaseHTTPServer.HTTPServer((‘localhost’, 8000), RequestHandler)
httpd.serve_forever()
if __name__ == "__main__":
sys.exit(main(sys.argv))
Y al entrar a http://localhost:8000 vería algo así:
Status: ------- Load average: 0.26, 0.35, 0.40
A esta altura creo que se hace bastante evidente el potencial de esta clase BaseHTTPServer. Piensen lo sencillo que sería hacer un servidor para un web service REST (RESTful web service) implementando métodos do_GET, do_DELETE, do_POST etc.
Para jugar un poco hice una versión un poco más completa de este servidor de status. Al correrlo lanza el servidor HTTP, al cual podemos acceder para pedirle un status general del sistema en tres formatos: texto plano (plain), HTML y JSON. También le agregué un OptionParser para poder configurar el host y puerto en el cual el servidor deberá escuchar. Con comentarios y todo ocupa 149 líneas.
Pueden ver el código aquí: http://pastebin.com/G5FgTDiv

sos un capo