En esta ocasión trataré de ver cómo utilizar un framework de red, como es el caso de python-tornado.
Crearemos un site pequeño y básico, lo justo como para tener una idea de sus posibilidades.
En cuanto al uso, yo últimamente lo utilizo para todo: desde pequeñas aplicaciones web hasta herramientas de soporte en el escritorio, donde necesito un servidor.
Lo básico
Cuando comenzamos con python-tornado, necesitamos crear una estructura básica:
Es tan básica que no hace nada, pero nos viene bien para explicar la parte común a cualquier cosa que hagamos.
Lo primero es crear nuestra aplicación, que heredará de Application. Luego ejecutamos un servidor HTTP que dé soporte a nuestra aplicación. A continuación indicamos en qué puerto deseamos que escuche el servidor. Finalmente, lanzamos el bucle de eventos que se quedará “a la escucha” de peticiones.
Vamos a complicarlo un poquito más, soportando nuestra primera petición:
Lo que hemos añadido es un RequestHandler de los proporcionados por Tornado. En este caso, permite servir archivos estáticamente. Como véis, el manejador está asociado a una expresión regular que, en este caso, se ajustará a cualquier cosa. Podemos comprobarlo si accedemos a la URL https://localhost:8000/example.py (asumiendo que hayáis guardado el archivo en “example.py”). Podéis probar a crear otro archivo y ver cómo se puede acceder.
Nuestros propios manejadores
La gracia de esto está en crearnos nuestros propios manejadores:
En este ejemplo, si accedemos a la url https://localhost:8000/ mostrará “Hello, world!”, pero si accedemos a la url: https://localhost:8000/magmax, mostrará “Hello, magmax!”.
Opciones
Una de las características que más me gustan de Tornado es la gestión de opciones. Vamos a establecer el puerto de forma dinámica:
#!/usr/bin/env python# -*- coding: utf-8 -*-importtornado.httpserverimporttornado.ioloopimporttornado.webfromtornado.optionsimportdefine,optionsclassHelloworldHandler(tornado.web.RequestHandler):defget(self,name):ifnotname:name='world'self.write("Hello, {}!".format(name))define('port',default=8000,help='Port to be used')tornado.options.parse_command_line()handlers=[(r"/(.*)",HelloworldHandler),]application=tornado.web.Application(handlers)server=tornado.httpserver.HTTPServer(application)server.listen(options.port)tornado.ioloop.IOLoop.instance().start()
Como veréis, es sencillísimo definir nuevas opciones. Y encima, Tornado ya nos da algunas, relacionadas con el logging:
$ ./basic.py --help
Usage: ./basic.py [OPTIONS]Options:
--help show this help information
--log_file_max_size max size of log files before rollover
(default 100000000) --log_file_num_backups number of log files to keep (default 10) --log_file_prefix=PATH Path prefix for log files. Note that if you
are running multiple tornado processes,
log_file_prefix must be different for each
of them (e.g. include the port number) --log_to_stderr Send log output to stderr (colorized if possible). By default use stderr if --log_file_prefix is not set and no other
logging is configured.
--logging=debug|info|warning|error|none
Set the Python log level. If 'none', tornado
won't touch the logging configuration.
(default info) --port Port to be used (default 8000)$
Otras características
Tornado tiene otras muchas características. En otro post veremos algunas de ellas. De todas maneras, este post tan solo trata de ser meramente introductorio. Para más información, lo suyo es acceder a la documentación oficial.