Saltar a contenido

Pretty Conf

prettyconf es un paquete Python que facilita la creación de ficheros de configuración mediante la parametrización de sus variables.

Es habitual no incluir credenciales o datos sensibles en el control de versiones de ciertos proyectos de software. Para esto hay varias soluciones, pero la que nos propone prettyconf es utilizar una función genérica config() que se encargará de recuperar estos datos bien desde variables de entorno o bien desde un fichero .env.

Instalación

pip install prettyconf

Modo de uso

Su modo de uso es muy sencillo:

settings.py
from prettyconf import config

PASSWD = config('PASSWORD')#(1)!

    • Se busca PASSWORD en variables de entorno o en fichero .env
    • Si se encuentra, se asigna su valor a la variable PASSWD
    • Si no se encuentra, se eleva una excepción UnknownConfiguration.

settings.py
from prettyconf import config

UNAME = config('USERNAME', default='guido')#(1)!

    • Se busca USERNAME en variables de entorno o en fichero .env
    • Si se encuentra, se asigna su valor a la variable UNAME
    • Si no se encuentra, se asigna el valor por defecto 'guido' a UNAME

Ficheros .env

Aunque también existe la posibilidad de definir los valores mediate variables de entorno suele ser habitual utilizar un fichero de configuración .env para ello.

Su estructura es realmente simple:

.env
USERNAME="thisisme"
PASSWORD=verycomplicated#(1)!
MESSAGE="Talk is cheap, show me the code"

  1. Aunque podría ir sin comillas dobles, lo más fácil —para evitar errores— es ponerlas siempre.

Fuera de control de versiones

Es crucial dejar fuera del control de versiones el archivo .env mediante su inclusión en el fichero .gitignore.

Conversiones

Por defecto, cualquier valor que le demos a una variable mediante prettyconf se interpretará como una cadena de texto (str).

Pero es posible indicar conversiones explícitas en la propia llamada a la función:

Conversión Explicación Valor ITEM Ejemplo
config.boolean Convierte a booleano(1) 'On' config(ITEM, cast=config.boolean) True
config.list Convierte a lista(2) 'A,B,C' config(ITEM, cast=config.list) ['A','B','C']
config.tuple Convierte a tupla(3) 'A,B,C' config(ITEM, cast=config.tuple) ('A','B','C')
config.json Convierte a objeto Python(4) '{"a": [1, 2], "b": [3, 4]}' config(ITEM, cast=config.json) {'a': [1, 2], 'b': [3, 4]}
  1. Ejemplos: On|Off, 1|0, yes|no, true|false, t|f
  2. Desde cadenas de texto separadas por comas.
  3. Desde cadenas de texto separadas por comas.
  4. Desde cadena de texto con objeto JSON.

Conversiones personalizadas

Además de las conversiones predefinidas es posible crear conversiones personalizadas mediante una función propia.

Por ejemplo, supongamos una configuración que almacena latitud y longitud de un determinado lugar (geolocalización):

settings.py
def geoloc(loc: str) -> tuple[float, float]:
    return tuple(float(v) for v in loc.split(','))

TEIDE_GPS = config('TEIDE_GPS', cast=geoloc)

Con esto podríamos «leer» un fichero de configuración tipo:

.env
TEIDE_GPS="28.2723364,-16.6631076"#(1)!

  1. Esto se convertiría en una tupla: (28.2723364, -16.6631076) (cuyos valores ya estarían en formato flotante).