django-environ: Diccionarios anidados

 Hace poco estaba tratando de encontrar la forma de cargar una serie de diccionarios anidados usando django-environ, al estilo de la configuración para la base de datos en django.

Para ser más preciso intentaba cargar una serie de nombres, llaves y secretos para buckets en S3.

# archivo: path/to/.env
AWS_S3_BUCKETS='BUCKET1=name=bucket1;key_id=key_id1;secret=secret1,BUCKET2=name=bucket2;key_id=key_id2,secret=secret2'

La cuestión es que django-environ no puede realizar la carga de diccionarios anidados, pero, sí puede cargar listas y "parsear" diccionarios anidados (al menos 1 nivel de anidación), si juntamos esas dos capacidades podemos crear una nueva definición de variables para este tipo.

Para cargar este nuevo tipo de valores necesitamos hacerlo en nuestro código de la siguiente manera: 


# archivo: settings.py
import environ
env = environ.Env()
env.read_env('path/to/.env')
...
AWS_S3_BUCKETS=dict([(var.split("=",1)[0], env.parse_value(var.split("=",1)[1], {})) for var in env.parse_value(value, list)])
...