[Programación] El framework web en Python más rápido: wheezy.web

wheezy.web no tiene logo; la imagen la hice yo en GIMP.

Desde hace mucho tiempo dejé de programar en Python, pero eso no impide que comparta con vosotros las tecnologías que conozco ;). Tiempo atrás me enfrasqué en la búsqueda del “mejor” framework web en Python, ya que el que usaba (Web2Py) era endemoniadamente lento. Mi investigación me llevó hasta wheezy.web; los que lo conocen seguramente lo hayan hecho a través del espectacular benchmark que hizo el autor en su blog:

Lo sé, 25.000 solicitudes por segundo en comparación con el resto de frameworks es una auténtica pasada. Yo mismo usé wheezy.web durante un tiempo y he de decir que es una auténtica obra de arte. Mires por donde lo mires: la rapidez, la simplicidad, la seguridad… Todo. Y encima es el trabajo de una única persona: Andriy Kornatskyy.

  • Funciona con Python 2, Python 3 y PyPy. Aunque el 3 dé mejor rendimiento, es preferible seguir usando el 2 hasta que el 3 madure lo suficiente.
  • Su diseño es modular, por lo que wheezy.web son más cosas: wheezy.template, wheezy.html, wheezy.security… Usa las partes que quieras.
  • Documentación sencilla y fácil de entender.
  • Optimización automática del HTML (lo comprime para que ocupe menos sin necesidad de usar herramientas externas).
  • Como no podía ser de otra manera, es software libre y código abierto ;D.
  • etc…

En el blog de Andriy hay magníficos tutoriales para instalar wheezy.web a secas o con i18n (múltiples idiomas); también explica cómo usar wheezy.web con Nginx. El inconveniente de todos sus tutoriales es que asume que usas Debian, ya que él no ha probado en otras distros.

Si usas Fedora y te interesa wheezy.web, ¡estás de suerte! Aquí tienes el comando que instalará los paquetes necesarios para poder seguir sus tutoriales:

sudo dnf install python python-devel python3 python3-devel python-setuptools python-virtualenv libxml2 libxml2-devel libxslt libxslt-devel libmemcached libmemcached-devel memcached memcached-devel gzip ntpdate gettext uwsgi uwsgi-plugin-python socat nginx

El tutorial que ofrece Andriy para instalar wheezy.web con Nginx usa un script pensado específicamente para Debian, por lo que tendréis que hacerlo por vuestra cuenta si usáis un sistema distinto. En mi caso me basta con uWSGI, por lo que nunca lo he intentado.

La verdad es que existiendo wheezy.web me parece un crimen utilizar otro framework, así que si trabajas con Python, ¡échale un vistazo como mínimo! La única desventaja que se le puede achacar es que no trae ninguna capa de abstracción para facilitar el trabajo con bases de datos (ni falta que hace, pero hay gente que lo agradece).

Y esto ha sido todo. Un artículo breve, pero de relevancia. ¡Prometo traer más tecnologías interesantes! Nos vemos~.

Por cierto, una curiosidad, ¿sabéis por qué se llama “wheezy”? Andriy es fan de Debian. Ahí lo dejo ;).


22 comentarios

  1.   Bruno Cascio dijo

    El rendimiento no es el único factor. Comparado a Django, es bastante ilegible. Y sinceramente las 25000 peticiones por segundo habría que verlas en acción, pero prefiero quedarme con 15000 (django) escribir saludablemente, y el resto del trabajo delegarlo a la infraestructura, la que REALMENTE es la que te va a recibir o no, 25000 peticiones.

    Saludos! Gracias por la data 🙂

    1.    Bruno Cascio dijo

      De màs está decir que para hacer el benchmark uso versiones antigüas de otros frameworks…

      1.    Lajto dijo

        El artículo del benchmark es del 2012. Lo volvió a modificar y ampliar en el 2013 y él mismo especifica que son de ese año: “Latest available versions as of this writing (March 15, 2013)”

    2.    Lajto dijo

      La ilegibilidad que mencionas no creo que sea para tanto. Entiendo que muchas veces se busca facilidad para programar, pero no creo que haya diferencias realmente considerables. Yo usé durante un año Web2Py, y te aseguro que es de los frameworks más fáciles de usar que hay disponibles. Eso sí, su rendimiento es pésimo en muchísimos sentidos… En el artículo del benchmark el propio Massimo Di Pierro (creador de Web2Py) tiene un debate con Andriy en el que finalmente admite que hay mucho por mejorar; hablando con Andriy por IRC, me decía “existe una filosofía ampliamente aceptada de ponerle de todo a los frameworks e hincharlos de características aunque la mayoría no se usen”, y cuánta razón tenía…

      Sobre lo que dices de la infraestructura, comparto parcialmente lo que dices; 10.000 de diferencia es MUCHO, sobretodo cuando hablamos del framework más popular y maduro versus uno muy reciente y poco conocido. Mi enfoque siempre es el de combinar la máxima eficiencia con la máxima productividad, y creo que wheezy.web es el que mejor lo hace. He usado Web2Py (el que más), Django, Pyramid y wheezy.web y te aseguro que no tiene rival. Una vez te adaptas a su forma de hacer las cosas, no te despegas de él. La únicas ventajas de Django es la amplia comunidad que tiene y los recursos que hay por todo Internet; es decir: facilidad. wheezy.web es bastante nuevo en comparación, y lo conoce muy poca gente; si se va a lo fácil fácil, mejor Web2Py o Django xD.

      No quiero extenderme, pero cuando hablamos de solicitudes por segundo hablamos de concurrencia. Si se busca concurrencia, Python no es el lenguaje apropiado. Para eso están otros lenguajes como Erlang o Haskell (y si me apuras, Rust). Pero precisamente por ello es impresionante que wheezy.web ocupando tan poco código, siendo el trabajo de una persona en su tiempo libre y otra serie de factores, haya logrado alcanzar semejante rendimiento.

      Entiendo eso que dices de “escribir saludablemente”, pero uno nunca sabe cuánto puede crecer un proyecto a largo plazo. Usar herramientas más eficientes y concurrentes, además de simples (mantengo que wheezy.web es simple para el rendimiento que tiene), permiten ahorrar dinero y hacer que el proyecto escale durante más tiempo sin cambiar de lenguaje. Al final todo está en el dinero que uno tiene para pagar su servidor. Hay webs muy famosas en PHP, cuando PHP es horrible en rendimiento… ¿Pero cómo solucionan ese problema? Comprando mejores servidores. Con el otro enfoque se soluciona programando mejor y ahorrando recursos :P.

      Siento haberme extendido tanto. Me apasiono muy fácilmente xDDD. ¡Saludos!

      1.    Bruno Cascio dijo

        Entendí perfectamente a lo que te refieres, pero justamente por lo que mencionas, si un proyecto tiende a crecer o no, ya desde el vamos con wheezy no hay capa de bases de datos.

        A mi punto de vista, lo mejor es no casarse con ningún lenguaje. Si quieres concurrencia puedes usar Node también, que su motor corre en C.

        Lo que mecionas del rendimiento, no es sólo escalar verticalmente (el caso de PHP), Facebook por ejemplo brinda HHVM, que he leido (no probado) que mejora en un 50% el rendimiento y esto no es comprar servidores. PHP a secas sin capas de caché y/o otras formas de optimizar es tan “malo” como cualquier otro lenguaje sin esto último, y digo malo como para darles un nombre, no es sólo “programar mejor”.

        Saludos! 🙂

      2.    Lajto dijo

        A ver, lo que no hay es capa de abstracción. Pero tú usas la librería o módulo correspondiente para trabajar con tu base de datos y fuera, no hay más misterio. La capa de abstracción de Web2Py es muy sencilla, por ejemplo, pero el rendimiento baja muchísimo al ni siquiera poder escribir SQL optimizado. Todo es en Python; fácil, pero a cambio de rendimiento.

        Conozco HHVM y precisamente por eso es por lo que lenguajes como PHP son malísimos para los tiempos modernos; si Facebook estuviera en Haskell o Erlang no habría hecho falta crear HHVM. Usar caché, comprimir los archivos que se envían y reciben, etc. son aspectos evidentes de cualquier desarrollo. El tema está en que la herramienta debe dar la talla :). Y hay herramientas que no la dan. El mejor ejemplo de ello es JavaScript… En ese caso al menos existen maravillas como CoffeeScript, Dart, etc. que compilan a JS.

        ¡Saludos!

      3.    Bruno Cascio dijo

        Perfecto! 🙂

        Sólo una cosa, facebook si utiliza haskell, más precisamente Haxl 🙂

      4.    Cesar dijo

        Bueno, yo uso bastante web2py, estoy de acuerdo con que no es el framework mas rapido, pero ese benchmark me parece un poco fuera de lugar, mas aún cuando estamos hablando de hace ya unos 3 años, la aplicación hola mudo de web2py está muy cargada en comparación con las de otros frameworks, pero yo, sinceramente, no he experimentado esa diferencia abismal en el rendimiento entre mis aplicaciones escritas en web2py y django.

        Por cierto, en web2py si se puede escribir SQL para realizar las consultas directamente.

        Saludos.

  2.   urKh dijo

    El Framework web mas rapido dices, pero no muentras algun ejemplo y otros factores claves, como el desarrollo, productividad, documentacion. Existiendo django, no se por que parece ser un crimen no utilizar este :p

    1.    Lajto dijo

      – En la documentación ya hay ejemplos. En su página de BitBucket también: https://bitbucket.org/akorn/wheezy.web/src/tip/demos/
      – Sobre el desarrollo y la productividad, personalmente me parece que resumirlo en “simplicidad” es una buena opción. ¿Que hay frameworks más simples y fáciles todavía? Claro. Pero no con tanto rendimiento.
      – El link a la documentación lo he puesto en el artículo xDDD.
      – El por qué digo que es un crimen es porque considero que una página web debe ser lo más eficiente posible, en todos los sentidos. Como he mencionado antes, hay frameworks más fáciles de usar, pero usar wheezy.web tampoco es programar en C. Simplemente hay que esforzarse más :).

      Saludos ^^.

  3.   Lajto dijo

    Por cierto, por si a alguno le da pereza informarse y cree que Wheezy Web sólo gana en solicitudes por segundo… Aquí tenéis unos cuantos benchmarks más:

    http://paste.desdelinux.net/5128 (el filtro de spam de DesdeLinux no me deja poner tantos links)

    Pido disculpas por no haberlos incluido previamente. Pensé que con uno era suficiente para llamar la curiosidad xD. ¡Saludos!

  4.   Fenriz dijo

    Hasta ahora feliz con Django.

    1.    Oclay dijo

      Ehh cada vez que leo estas cosas me da rabia, pesaba que era solo con los frameworks php (Symfony,Yii,CondeIgniter,Phalcon………wdf!!). Si ya Django tiene una comunidad (bastante grande) y es un excelente framework por qué en vez de perder el tiempo reinventando la rueda no se unen al equipo de django.@Lajto en tu conversación con el autor de wheezy.web porque no le preguntas si nunca ha pensado unirse a django team,joder.Saludos..

      1.    Lajto dijo

        Es que aunque ambos sean frameworks web tienen enfoques muy distintos. Django es pesado, tiene mucho código, mientras que wheezy.web es ligero apuesta por la simpleza y la optimización. Que yo sepa, wheezy.web es el único framework web en Python realmente modular (es decir, que divide todo su código en distintas partes que pueden funcionar de forma independiente). Tiene muchas características que lo diferencian del resto.

        ¿Por qué no incorporarse a Django, dices? Porque Django ha sido diseñado con enfoques completamente distintos. ¿Cómo le aplicas un diseño modular a Django? ¡Habría que rehacerlo prácticamente desde cero! Lo mismo con muchas otras cuestiones.

        Entiendo ese sentimiento de “mejor un único framework que funcione bien con una gran comunidad”, pero no es tan fácil. Para que me entiendas, por hacer una asociación superficial, Django es como si fuera Debian y wheezy.web como si fuera… ¿Arch? ¿Gentoo? Definitivamente es un mal ejemplo, pero creo que se entiende xDDD.

        ¡Saludos!

  5.   Ulises dijo

    Que tal Lajto, oye estoy haciendo una app y lei la documentación de wheezy.web y es el primer framework web en python que le he entendido a la primera 🙂 Veras no tengo mucho conocimiento de redes y web, pero tengo especial atracción a la programación.
    ¿Podrias ayudarme a como modificar el hola mundo para hacerlo un servidor publico? talvez es una pregunta muy tonta, disculpa, pero no encuentro en la documentación como hacerlo.
    Otra pregunta, 😉 en los métodos get y post, como devuelvo información que no sea una página html, ¿retorno informacion tal cual? como un string o una lista o cualquier tipo de dato. El cliente una app en android.

    1.    Lajto dijo

      ¡Hola Ulises! Me alegra muchísimo que estés probando wheezy.web :D.

      Sobre lo que comentas, te recomiendo ampliamente que no montes tu propia estructura. La que monta Andriy es bastante buena, por lo que te recomiendo que la sigas. En el artículo hay dos links al blog de Andriy donde explica los pasos con i18n y sin i18n. Por si te resulta un poco confuso, te explico cómo hacerlo sin i18n a continuación:

      Abre una terminal y ejecuta estos cuatro comandos (sustituye “web-de-prueba” por el nombre de la carpeta que quieras para tu proyecto):

      wget https://bitbucket.org/akorn/wheezy.web/downloads/quickstart-empty.zip

      unzip quickstart-empty.zip

      mv quickstart-empty web-de-prueba

      rm quickstart-empty.zip

      Si quieres utilizar PIL, modifica el archivo setup.py y descomenta el código correspondiente. Una vez estés listo, ejecutas los siguientes tres comandos:

      cd web-de-prueba

      make env

      env/bin/easy_install uwsgi

      Ya está tu servidor montado. Si quieres hacer un benchmark rápido para ver si funciona, estando dentro de la carpeta, ejecutas:

      make test nose-cover benchmark

      Te recomiendo ir a “etc/development.ini” y cambiar “limit-as = 120” a “limit-as = 512”. Se trata de cuántos MB de RAM se “comerá” uWSGI, por lo que en el futuro podría aumentarse de ser necesario.

      Finalmente, cada vez que quieras abrir tu servidor, bastaría con localizarte en la carpeta de tu proyecto y ejecutar:

      make uwsgi

      Sobre las otras cuestiones… Por defecto, el servidor está programado para funcionar en localhost. Si quieres hacerlo público, porque ya lo tienes listo y quieres usarlo en un servidor físico en producción, bastaría con abrir “src/app.py” y localizar lo siguiente: make_server(”, 8080, main). El primer parámetro es un string vacío, ¿no? Pues ahí pones la IP de tu servidor. El segundo parámetro es el puerto que quieras usar, que por defecto está en 8080.

      Finalmente, lo que comentas de retornar algo que no sea un HTML, ¡claro que se puede! En la documentación te explican cómo retornar de todo: https://pythonhosted.org/wheezy.web/userguide.html#web-handlers

      ¡Un saludo! Cualquier cosa me dices ;).

      1.    Ulises dijo

        Muchas gracias Lajto, deverdad me aclaraste las dudas, habia intentado con django pero como te comenté no soy ingeniero en sistemas y django creo que trae mucho mas de lo que necesitaba, use wheezy.web para probar una aplicación en android y comunicarlo con un servidor. Algo muy sencillo pero bastante rápido y práctico. Oye una pregunta mas, hace poco vi que se armo un gran alboroto con http/2 ¿como se en que protoco trabaja wheezy.web?, ¿puedo hacer un servidor que use el http/2 en wheezy.web? O recomiendame un libro, blog, tutorial que este en manzanas que me pueda explicar sobre todo el asunto de redes y comunicaciones. Denuevo gracias.

      2.    Lajto dijo

        Hola de nuevo Ulises ^^.

        HTTP/2 es muy reciente y hasta dentro de 1 año no empezará a ser adoptado en serio, por lo que no te molestes en ello :). Si quieres seguridad, usa HTTPS y ya está.

        No estoy seguro de qué usa Wheezy Web para el HTTP, así que supongo que será WSGI.

        ¡Un saludo!

  6.   Lajto dijo

    Por cierto, una cosilla de nada. En algunas distros aparece un mensaje de WARNING sobre .python-eggs. No pasa nada si aparece, pero si os resulta molesto podéis quitarlo con:

    chmod go= ~/.python-eggs

    ¡Saludos!

  7.   Diego dijo

    Estoy utilizando Django, pero revisaré la documentación para ver que tal. Gracias por compartir. Saludos

  8.   JDVillegas dijo

    Se puede usar desde windows!!!, hay algun tutorial??

    Gracias

  9.   Lalita dijo

    Hola tenemos mucha experiencia con Python. Me parece que están remando en contra de la corriente. Lo mejor que se ha inventado para este lenguaje es Django. Pueden hacer una estadísticas y consultar a cientos de programadores de todo el mundo, les dará más de un 80%, la mayoría no se equivoca. Si reman o nadan en contra de la corriente, tarde o temprano se ahogarán…

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.