September 12, 2017

Bottle, servidor web en python para IoT

Bottle es un paquete para recibir y contestar a solicitudes HTTP. Básicamente levanta un servidor y dirige las solicitudes a una función.

Recientemente me encuentro en un proyecto de IoT. Consiste en un basurero que utiliza una red neuronal convolucional para llevar a cabo una operación de reconocimiento y clasificación de imágenes. Esto con el propósito de clasificar desechos reciclabes y no reciclables. Sin embargo, en este artículo no me enfocaré en la aplicación de inteligencia artificial. Lo importante de este proyecto es la forma en la que estoy conectando el sistema con una interfaz web. Para esto, estoy utilizando Bottle, un micro-framework web en Python.

Proyecto.

En este caso, utilicé Tensorflow en Python para desarrollar un sistema de reconocimiento y categorización de imágenes. El sistema correrá en una computadora con mínimos recursos, probablemente una Raspberry Pi; y tendrá una cámara y una pantalla únicamente.

Sin embargo, necesitaba un método para que el usuario pudiera interactuar con este sistema; cambiando configuraciones, personalizando ciertos aspectos del sistema, etc. Como desarrollador web lo primero en lo que pensé fue en una interfaz web, con HTML, CSS y algo de JavaScript para conectar con el backend.

No obstante, se me presentó un reto que nunca antes había tenido. Desarrollar una conexión con una interfaz web, que funcionará únicamente de manera local, en una máquina con pocos recursos, y realizará operaciones de alta demanda computacional, con pocas solicitudes por hora.

El reto era todo lo contrario a lo que un desarrollador web suele realizar. No podía utilizar un framework como Django, puesto que implicaría un proceso mucho más largo para algo muy simple. Debía buscar el framework más elemental para desarrollo web, utilizando Python para una mayor integración con todo el sistema.

Tras un poco de investigación, descubrí Bottle.

Bottle al rescate.

Logo de Bottle
Logo de Bottle

Bottle es un micro-framework web WSGI, rápido, simple y ligero, para Python.

Más allá de lo que menciona en su página web, ¿qué es Bottle? ¿Y por qué me ha parecido tan buena opción en un proyecto IoT?

Bottle es un paquete para Python, con el que puedes recibir y contestar a solicitudes HTTP. Básicamente lo que hace es levantar un servidor y dirigir las solicitudes a alguna función que declares. Realmente es así de simple, no trae integración con alguna base de datos, no incluye vistas genéricas, tampoco utiliza el modelo MVC. Simplemente te permite establecer una conexión entre el backend (desarrollado completamente por uno mismo) y el frontend.

¿Qué es lo asombroso de este paquete?

En mi opinión, lo mejor es que establece un puente muy sencillo entre un script python y la web. En muchos casos, al desarrollar un servicio web, una API REST, entre otras cosas, puede perderse la noción de que estás desarrollando en Python. Utilizar frameworks como Django puede volverse algo muy metódico, y es muy fácil olvidar que tienes miles de librerías de este lenguaje que puedes integrar. No hay que olvidar que Python es un lenguaje con baterías integradas.

Esto no sucede con Bottle, puesto que todo el backend depende completamente de tí. Integrar una base de datos, un ORM, o un script para descargar imágenes, deberás construirlo todo por tu cuenta. Esta es la primera vez que realmente siento que regreso a las raíces de la programación en python. Puedo integrar todo lo que alguna vez estudié y aquellas librerías que he aprendido a manejar, para desarrollar algo.

¿Por qué usarlo en IoT?

Obviamente por más romántico que suene, no siempre es óptimo desarrollar todo desde cero. Generalmente es por eso que los desarrolladores web nos vamos por Django o Flask. Sin embargo, cuando programas algo destinado al IoT, esto cambia totalmente. Entramos a un paradigma donde quieres enfocarte en la lógica de tu programa, y no en la manera en procesar la mayor cantidad de solicitudes lo más rápido posible.

Bottle es excelente en realizar exactamente eso. Como simple ejemplo, supongamos que tengo una función obtener_categoria(imagen) . Con un framework como Django sería necesario realizar toda la configuración inicial, crear una url, crear una vista, y dentro implementar la función. Con Bottle es así de sencillo:

from bottle import route, run

@route('/categorizar', method='POST')
def categorizar_imagen():
archivo = request.files.get('upload')
categoria = obtener_categoria(archivo)
return categoria

run(host='localhost', port=8080)

Con solo 7 líneas de código tenemos un servidor funcionando, capaz de recibir una solicitud, procesarla y responder. Es por la simplicidad de implementar código en Python, que considero a Bottle como la mejor opción para implementar una web que funcione en dispositivos del IoT.


Y básicamente eso es lo que quería comunicar con este artículo. Próximamente publicaré el código completo que estoy utilizando para implementar el reconocimiento de imágenes mediante Tensorflow en un servidor Bottle. Recientemente estoy trabajando también en un proyecto que consiste en una red social, yo me estoy encargando del Backend, y un compañero del Frontend. Lo estamos conectando por medio de entradas API REST, entonces muy probablemente pronto publicaré sobre Django REST Framework, autenticación con JWT, tareas asíncronas con Celery, entre otros temas.

Puedes estar al tanto de lo que publicó y de mis proyectos en mis redes sociales:

Otros posts similares: