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
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
# 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
{
"SECRET_KEY": "ejemplo-secret",
"DATABASE_URL": "sqlite:///ejemplo.db",
"ITEMS_PER_PAGE": 20
}
Ejemplo
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
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
# 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
# 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