Gestión de configuración de Flask

Cualquier aplicación necesita configuración: dirección de base de datos, claves secretas, interruptores de modo de depuración, etc.

Flask ofrece un sistema de configuración flexible que admite cargar configuración desde múltiples fuentes para satisfacer las diferentes necesidades de desarrollo y producción.


Fundamentos del objeto Config

La configuración de la aplicación Flask se almacena enapp.configque se comporta como un diccionario: puedes leer y escribir cualquier valor de configuración mediante su nombre de clave:

Ejemplo

from flask import Flask

app = Flask(__name__)

# Establecer directamente una opción de configuración
app.config["SECRET_KEY"] = "your-secret-key"
app.config["DEBUG"] = True
app.config["DATABASE"] = "ejemplo.db"

# Leer la configuración
print(app.config["SECRET_KEY"])  # Salida: your-secret-key
print(app.debug)                 # Salida: True (DEBUG se puede acceder mediante el atributo app.debug)

Nombre de clave de configuracióndebe estar en mayúsculas, es una convención de Flask, utilizada junto con los métodos de carga de configuración.


Opciones de configuración integradas

Flask incluye una gran cantidad de opciones de configuración para controlar el comportamiento del framework; a continuación se muestran las más utilizadas en desarrollo:

Opción de configuración Tipo Valor predeterminado Descripción
DEBUG bool None Si activar el modo de depuración (debe ser False en producción)
TESTING bool False Si activar el modo de prueba
SECRET_KEY str None Clave para firmar la Session (obligatoria)
SERVER_NAME str None Dominio del servidor + puerto, como "example.com:5000"
MAX_CONTENT_LENGTH int None Tamaño máximo del cuerpo de la solicitud (bytes), para limitar las subidas
SESSION_COOKIE_NAME str "session" Nombre de la cookie de Session
PERMANENT_SESSION_LIFETIME timedelta 31 días Período de validez de la Session permanente

Cargar desde un archivo Python — from_pyfile

La práctica más común es escribir la configuración en un archivo Python separado y luego cargarla:

# 文件路径:config.py(与 app.py 同级目录)
# 注意:所有键名必须大写
SECRET_KEY = "your-production-secret-key"
DATABASE_URL = "postgresql://user:pass@localhost/db"
MAX_CONTENT_LENGTH = 16 * 1024 * 1024  # 限制上传文件大小 16MB

# 开发配置
DEBUG = True

Código de app.py:

# 文件路径:app.py
from flask import Flask

app = Flask(__name__)

# 加载 config.py 中所有大写的变量到 app.config
app.config.from_pyfile("config.py")

print(app.config["DATABASE_URL"])  # 输出: postgresql://user:pass@localhost/db

Cargar desde variables de entorno — from_prefixed_env

Cargar desde variables de entorno es la práctica recomendada por 12-Factor App y la más adecuada para despliegues en producción.

Flask lee por defecto las variables de entorno con el prefijoFLASK_y los valores se intentarán analizar como JSON:

# 在终端设置环境变量(或写入 .flaskenv 文件)
export FLASK_SECRET_KEY="prod-secret"
export FLASK_MAX_CONTENT_LENGTH=16777216

Código de app.py:

from flask import Flask
from datetime import timedelta

app = Flask(__name__)

# 加载默认配置
app.config["PERMANENT_SESSION_LIFETIME"] = timedelta(days=7)

# 自动加载所有以 FLASK_ 开头的环境变量
# 例如 FLASK_SECRET_KEY 会成为 config["SECRET_KEY"]
app.config.from_prefixed_env()

# 也可以自定义前缀
# app.config.from_prefixed_env("EJEMPLO")  # 加载 EJEMPLO_ 前缀的变量

Configuración anidada

Usando doble guion bajo__se puede establecer configuración anidada:

$ export FLASK_DATABASE__HOST="localhost"
$ export FLASK_DATABASE__PORT="5432"

Resultado después de cargar:

Ejemplo

app.config.from_prefixed_env()
# El valor de config["DATABASE"] es {"host": "localhost", "port": 5432}
print(app.config["DATABASE"])  # Salida: {'host': 'localhost', 'port': 5432}

Cargar desde JSON/TOML — from_file

Además de archivos Python y variables de entorno, Flask también admite cargar configuración desde formatos como JSON, TOML, etc.:

Ejemplo

// Ruta del archivo: config.json
{
  "SECRET_KEY": "ejemplo-secret",
  "DATABASE_URL": "sqlite:///ejemplo.db",
  "ITEMS_PER_PAGE": 20
}

Ejemplo

import json

app = Flask(__name__)

# Cargar desde archivo JSON (text=True indica modo texto; por defecto es True)
app.config.from_file("config.json", load=json.load)
# Cargar desde archivo TOML (requiere tomllib o tomli)
# import tomllib
# app.config.from_file("config.toml", load=tomllib.load, text=False)

Cargar desde un objeto — from_object

Carga directamente todos los atributos en mayúsculas desde un objeto de Python (módulo o clase):

Ejemplo

# Práctica recomendada: definir clases de configuración, diferenciando entornos
class Config:
    SECRET_KEY = "dev-key"
    DATABASE = "dev.db"

class ProductionConfig(Config):
    DEBUG = False
    DATABASE = "prod.db"

class DevelopmentConfig(Config):
    DEBUG = True

# Seleccionar la configuración según la variable de entorno
import os
config_mode = os.environ.get("FLASK_CONFIG", "development")
if config_mode == "production":
    app.config.from_object(ProductionConfig)
else:
    app.config.from_object(DevelopmentConfig)

Carpeta instance — configuración privada

Algunas configuraciones no son adecuadas para enviarse al repositorio de código (como las claves de producción); se pueden colocar en lainstancecarpeta:

Ejemplo

app = Flask(__name__, instance_relative_config=True)

# Cargar instance/config.py (este archivo no se envía a Git)
app.config.from_pyfile("config.py", silent=True)

# La carpeta instance suele estar en una ubicación independiente fuera del directorio del proyecto
myflaskapp/
├── app.py
├── config.py         # 公共配置(可提交到 Git)
└── instance/          # 不提交到 Git(.gitignore)
    └── config.py     # 私密配置(密钥等)

Prioridad de carga de configuración

El orden de carga de configuración más común en la práctica:

Ejemplo

app = Flask(__name__)

# 1. Cargar configuración predeterminada (valores por defecto codificados en el código)
app.config.update({
    "ITEMS_PER_PAGE": 20,
    "MAX_CONTENT_LENGTH": 16 * 1024 * 1024,
})

# 2. Cargar configuración de instancia (instance/config.py, prioridad mayor que los valores predeterminados)
app.config.from_pyfile("config.py", silent=True)

# 3. Cargar variables de entorno (máxima prioridad, sobrescribe todos los ajustes anteriores)
app.config.from_prefixed_env()

Esta prioridad garantiza: los valores predeterminados son los más débiles, la configuración de archivos es media, y las variables de entorno son las más fuertes; cumple con las mejores prácticas de 12-Factor App.

Otras extensiones