Manejo de parámetros de configuraciones en Flask

- Andrés Cruz

In english
Manejo de parámetros de configuraciones en Flask

Los archivos de configuración en Flask nos permiten agregar parámetros globales a nuestro proyecto; habilitar el modo testing, debug, colocar la clave secreta de la app empleada por ejemplo para la encriptación de datos entre otros muchas configuraciones que puedes agregar en Flask.

Flask nos provee algunos mecanismos con los cuales podemos manejar parámetros de configuración de nuestro proyecto, por ejemplo ambiente, base de datos, conexiones a servicios de terceros, etc.

Estas configuraciones se hacen en archivos de configuración en Flask nos permiten agregar parámetros globales a nuestro proyecto; habilitar el modo testing, debug, colocar la clave secreta de la app empleada por ejemplo para la encriptación de datos entre otros muchas configuraciones que puedes agregar en Flask.

La configuración en Flask es o una clase/subclase o simplemente un diccionario y puede ser modificada de manera programática y en tiempo de ejecución desde nuestro proyecto en Flask; por ejemplo, fíjate en las siguientes líneas de código en donde estamos cambiando programáticamente el modo debug a true, y lo hacemos mediante un arranque de configuración o simplemente un diccionario y de esta manera podemos emplear el objeto de config en Flask de manera programática:

app = Flask(__name__)
app.config['DEBUG'] = True
app.debug = True

Configuración en base a variables de entorno

Como hablamos en el artículo anterior, nosotros también contamos con configuraciones que podemos emplear como variables de entorno:

DEBUG = True
TESTING = True

Por ejemplo, para modificar el ambiente desde una variable de entorno:

export FLASK_ENV=development flask run

Parámetros de Configuración basadas en clases u objetos

Este viene siendo el enfoque más completo y organizado y por lo tanto es el recomendado que empleamos en nuestro curso; ya que, como vamos a ver, nos ofrece la posibilidad de emplear distintas configuraciones según el ambiente que nos encontremos, podemos realizar distintos parámetros de configuraciones en base a clases, lo cual es un mecanismo muy interesante que tenemos para tener configuraciones de todo tipo, y para distintos ambientes de desarrollo.

Simplemente creamos un archivo con cualquier nombre y extensión de .py y agregamos una clase; por ejemplo un archivo llamado configuration.py; por ejemplo, en nuestro curso de Flask, empleamos la siguiente configuración:

class BaseConfig(object):
   USER_APP_NAME = 'FlaskMalcen'
   USER_ENABLE_EMAIL = True
   'Base configuracion'
   SECRET_KEY = 'Key'
   DEBUG = True
   TESTING = False
   SQLALCHEMY_DATABASE_URI="mysql+pymysql://root:root@localhost:3306/pyalmacen2"
   RECAPTCHA_PUBLIC_KEY='6LffHtEUAAAAAI_KcKj6Au3R-bwhqRhPGe-WhHq_'
   RECAPTCHA_PRIVATE_KEY='6LffHtEUAAAAAJdHhV9e8yLOSB12rm8WW8CMxN7X'
   BABEL_TRANSLATION_DIRECTORIES='/Users/andrescruz/Desktop/flask/4_flask_app/flask_app/translations'
   #WTF_CSRF_TIME_LIMIT = 10
class ProductionConfig(BaseConfig):
   'Produccion configuracion'
   DEBUG = False
class DevelopmentConfig(BaseConfig):
   'Desarrollo configuracion'
   DEBUG = True
   TESTING = True
   SECRET_KEY = 'Desarrollo key'
   #MAIL_SUPPRESS_SEND = False
   MAIL_SERVER = "smtp.mailtrap.io"
   MAIL_PORT = 2525
   MAIL_USERNAME="xxx"
   MAIL_PASSWORD="xxx"
   #MAIL_DEFAULT_SENDER=('andres de DL',"andres@gmail.com")
   MAIL_USE_TLS=True
   MAIL_USE_SSL=False
   USER_EMAIL_SENDER_EMAIL="andres@gmail.com"
   CACHE_TYPE = "simple"

Definir parámetros de configuración empleando herencia entre clases

Ahora, supongamos que vamos a definir una clase base para realizar las configuraciones iniciales o de base que queremos que tenga el proyecto, y con esto podemos heredarlo a otras clases que vendrán siendo los distintos ambientes o modos que queramos que tenga nuestra aplicación.

Para cargarlo en nuestra app, y por lo tanto que nuestro proyecto pueda emplear estas configuraciones; por ejemplo, el modo de desarrollo:

app.config.from_object('configuration.DevelopmentConfig')

O el de producción:

app.config.from_object('configuration.ProductionConfig')

Lo interesante de esto, es que nosotros podemos fácilmente emplear configuraciones comunes que son las que tenemos en nuestra clase llamada BaseConfig y podemos heredarlas a otras clases que son las que empleamos para indicar los distintos modos de nuestra aplicación y este es el que empleamos en el curso sobre Flask.

Extra: Cargar configuraciones de manera dinámica

Muchas veces, necesitamos obtener datos dinámicos para crear la configuración; por ejemplo, para la carpeta de carga de archivos: perfectamente podemos definirlo en el init de nuestra app:

app.config['UPLOAD_FOLDER'] = os.path.realpath('.') + '/my_app/static/uploads 

Como puedes ver, esta es la versión más completa que puedes escoger al momento de desarrollar tus configuraciones el Flask, ya que podemos variar fácilmente entre un ambiente a otro, activando o desactivando ciertas configuraciones de manera automática con tan solo cambiar una línea de código.

Te dejo la documentación oficial para más detalle.

Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz en Udemy

Acepto recibir anuncios de interes sobre este Blog.