xmanoel@


Sacando las passwords del settings.py

Antes de que pase el tiempo voy a comentar una de las pocas y pequeñas modificafiones (un truco no se puede llamar ni programa) que hice en el Django de mi página. Es pequeña cosa, pero bueno, a alguno le puede gustar.

Una de las cosas que me llama la atención de Django es que las claves y las passwords vayan en el fichero settings.py (al menos en RubyOnRails estaban en un fichero YAML aparte). No quiero decir que me alarme especialmente lo de que las claves estén en un fichero de texto (dejando aparte Kerberos o algún sistema de llaves asimétricas no creo que haya solución al problema). Lo que me fastidia es que se mezclen parametros de configuración con datos que varian dependiendo del entorno y de la base de datos. ¿Como hacen las aplicaciones de Django para desplegarse en producción? ¿Hay que cambiar a mano la claves y usuarios despues de desplegar?

En mi caso la necesidad es que quería dejar mi código en un repositorio de código público (por si alguien quisiese mirar) pero no quería dejar allí las claves. Y quería que estuviese el settings.py en el repositorio (de poco vale tener el resto del código sin el settinngs.py correspondiente). Estuve buscando por Internet alguna solución a esta cuestión y no encontré nada.

He aquí mi solución:

1) Crear un fichero llamado secrets.py. En este irán las claves (los datos se definen como variables):


# este fichero no tiene nada especial
# solo sirve para almacenar los valores de configuracion
# que no quiero que suban al SubVersion
# por eso se llama -secrets-

s_a = 'Mister Yippi'
s_a_m = 'yippi@yey.com'

s_db_u = 'usuario'
s_db_p = 'password'
s_db_h = 'yey.com'

s_k = 'adfdafadfkadfl^*^1hh8omf!gtx(oola3'

2) Modificar el settings.py para que importe el secrets.py como si fuese un módulo (total es código Python, como quien dice):


# los datos privados estan en otro fichero de datos
from secrets import *

ADMINS = (
     (s_a, s_a_m),
)

MANAGERS = ADMINS

DATABASE_ENGINE = 'mysql'           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
DATABASE_NAME = 'django' # Or path to database file if using sqlite3.
DATABASE_USER = s_db_u              # Not used with sqlite3.
DATABASE_PASSWORD = s_db_p          # Not used with sqlite3.
DATABASE_HOST = s_db_h              # Set to empty string for localhost. Not used with sqlite3.

# Make this unique, and don't share it with anybody.
SECRET_KEY = s_k

3) Y finalmente añado el settings.py al repositorio de código (ya no tiene nada indiscreto que ver) y me acuerdo de no añadir nunca el secrets.py al control de versiones.

29 September 2009


Add your comment:

Don't insert HTML in comments