Bottle + https
Tags: bottle, https, python, webdev
Published: 2023-03-10 20:37:56

[Bottle](https://bottlepy.org/docs/dev/), 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.

``` bash
#!/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
```
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
```
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).

``` bash
python3 -m venv venv
source venv/bin/activate
pip install bottle
pip install gunicorn
```
Ya sólo nos queda crear nuestro maravilloso sitio https.
``` python
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
)
```
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
```
y comprobar el resultado de nuesto magnífico trabajo

**https://mi.dominio.net:8443**

**Fácil ¿no?**