Si utilizamos mod_wsgi para ejecutar una aplicación desde nuestro servidor, puede que necesitemos que ciertas variables de entorno definidas dentro de Apache sean visibles dentro de la aplicación. Esto nos viene bien si queremos, por ejemplo, indicar en la configuración de Apache las credenciales de acceso a la base de datos que utilizará la aplicación. Por defecto mod_wsgi resetea el entorno, dejando sólo información acerca de Python y poco más. En este artículo veremos como realizar esta tarea.
Para poner un ejemplo concreto, supongamos que tenemos una aplicación Django y queremos indicar desde la configuración de Apache cuáles son las credenciales de acceso. Por defecto, Django crea un fichero settings.py donde indicamos toda esta información de forma estática dentro del diccionario DATABASES:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'nombrebd',
'USER': 'miusuario',
'PASSWORD': 'secreto',
'HOST': '',
'PORT': '',
}
}
Para poner un ejemplo concreto, supongamos que tenemos una aplicación Django y queremos indicar desde la configuración de Apache cuáles son las credenciales de acceso. Por defecto, Django crea un fichero settings.py donde indicamos toda esta información de forma estática dentro del diccionario DATABASES:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'nombrebd',
'USER': 'miusuario',
'PASSWORD': 'secreto',
'HOST': '',
'PORT': '',
}
}
Los cambios a realizar implican crear un middleware en wsgi.py para obtener el entorno antes de ejecutar la application:
wsgi.py:
# -.- coding: utf-8 -.-
import os
from myproject import local_settings
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dugra.settings")
from django.core.wsgi import get_wsgi_application
_application = get_wsgi_application()
'''
Middleware que sobreescribe todas las variables definidas en local_settings con los valores que haya definidos en el entorno y que comiencen por LOCAL_{variable}. Las cadenas de texto literales "True" y "False" definidas en las variables de entorno se transforman en los valores booleanos correspondientes.
'''
local_settings_keys = dir(local_settings)
def application(environ, start_response):
for i in local_settings_keys:
try:
if environ["LOCAL_" + i] == "False":
local_settings.__setattr__(i, False)
elif environ["LOCAL_" + i] == "True":
local_settings.__setattr__(i, True)
else:
local_settings.__setattr__(i, environ["LOCAL_" + i])
except:
pass
return _application(environ, start_response)
A continuación definimos un módulo dentro de "myproject" llamado local_settings.py:
local_settings.py
# -.- coding: utf-8 -.-
"""
Configuración local para la aplicación. Todas las definiciones se pueden sobrescribir desde la configuración de Apache usando SetEnv y usando el prefijo LOCAL_. Por ejemplo:
SetEnv LOCAL_DBNAME "otrabd"
Si las de entorno no están definidas en la configuración de Apache, se tomarán los valores aquí definidos.
"""
# Parámentros de conexión a la BD
DBNAME = "nombrebd"
DBUSER = "usuario"
DBPASSWORD = "secreto"
DBHOST = ""
DBPORT = ""
En caso de que no definamos las variables de entorno, se tomarán los valores por defecto indicados en local.settings.py. En la configuración de apache podemos sobrescribir ahora cualquiera de las variables definidas en local_settings.py usando variables de entorno:
/etc/apache2/sites-available/mysite.conf:
...
SetEnv INTELLIGENIA_DBNAME nueva_bd
SetEnv INTELLIGENIA_DBUSER usuario_xy
SetEnv INTELLIGENIA_DBPASSWORD secreto
...
También tenemos que adaptar settings.py para que ahora tome los valores necesarios de local_settings.py, donde estarán nuestro valores por defecto o los valores sobreescritos por las variables de entorno:
settings.py:
# Django settings for myproject project.
...
from dugra import local_settings
...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': local_settings.DBNAME,
'USER': local_settings.DBUSER,
'PASSWORD': local_settings.DBPASSWORD,
'HOST': local_settings.DBHOST,
'PORT': local_settings.DBPORT
}
}
Espero que os sea útil.
Mario J. Barchéin Molina
Muy interesante Mario.
ResponderEliminarGracias