DEV Community

Cover image for Bottle + https
1N0T
1N0T

Posted on

Bottle + https

Bottle, es un framework web, escrito en python, que por su tamaño (un único fichero de 149K), entraría dentro de la categoría de microframework, aunque puede cubrir la mayoría de nuestras necesidades.

Una de sus limitaciones, es que no soporta de base HTTPs, pero como enseguida veremos, esta limitación es fácilmente subsanable.

Naturalmente, lo primero que necesitaremos, es un certificado. Si disponemos de uno firmado por una CA será perfecto. En caso contrario, no importa, vamos a crear nuestro propio certificado autofirmado.

Naturalmente, como no puede ser de otra manera, en este último caso, recibiremos una advertencia del navegador indicanco que el certificado no es confiable.

Aquí tienes un pequeño script en bash que creará las claves pública y privada del certificado. Naturalmente, deberás cambiar la variable DOMINIO, por el valor que te interese.

#!/bin/bash

# Este script crea un certificado autofirmado.
#    Clave privada: mi.dominio.net.key
#    Clave pública: mi.dominio.net.crt

DOMINIO=mi.dominio.net
DIASVALIDEZ=3650
CLAVEPRIVADA=$DOMINIO.key
CLAVEPUBLICA=$DOMINIO.crt

openssl req -x509 -nodes -days $DIASVALIDEZ -newkey rsa:2048 \
       -subj /CN=$DOMINIO                                    \
       -keyout $CLAVEPRIVADA                                 \
       -out $CLAVEPUBLICA
Enter fullscreen mode Exit fullscreen mode

Como imagino que harás las pruebas en tu equipo local, no te olvides de hacer una entrada en tu fichero /etc/hosts para que se pueda resolver la IP de tu dominio ficticio.

127.0.0.1 mi.dominio.net
Enter fullscreen mode Exit fullscreen mode

Ya tenemos nuestro certificado, así que vamos a crear nuestro entorno virtual y ha instalar lo que necesitamos. Bottle y gunicorn (que será el encargado de gestionar la comunicación https).

python3 -m venv venv
source venv/bin/activate
pip install bottle
pip install gunicorn
Enter fullscreen mode Exit fullscreen mode

Ya sólo nos queda crear nuestro maravilloso sitio https.

import os
from bottle import (route, run, request, response, abort, error, static_file) 


DOMINIO = "mi.dominio.net"


#===============================================================================
# Configuramos directorios para recursos estáticos.
#===============================================================================
BASE_DIR   = os.path.dirname(os.path.abspath(__file__))
STATIC_DIR = os.path.join(BASE_DIR, 'static')


@route('/', ['GET'])
def home():
   return "Sitio seguro !!!"


#===============================================================================
# Iniciamos el servidor web que expone las funciones en todas sus direcciones
# de red.
# 
# En lugar de 443 para https, para no requerir permisos de root, usamos el 8443.
#===============================================================================
run(
    reloader = True, 
    debug = True, 
    host = "0.0.0.0", 
    server='gunicorn',
    keyfile=f"{ DOMINIO }.key",
    certfile=f"{ DOMINIO }.crt",
    port = 8443
)
Enter fullscreen mode Exit fullscreen mode

El secreto, bottle cumple con la espacificación de WSGI (Web Server Gateway Interface) y, nos permite ejecutarlo como servidor web autónomo, o delegar en un servidor que cumpla con la especificación. En nuestro caso, gunicorn que es quien nos dará el soporte para https.

Ya solo nos queda ejecutar nuestro servidor, con algo parecido a:

python3 main.py
Enter fullscreen mode Exit fullscreen mode

y comprobar el resultado de nuesto magnífico trabajo

https://mi.dominio.net:8443

Fácil ¿no?

Top comments (0)