5 Estructura de Carpetas Recomendada
mi_app_shiny/
├── .vscode/
│ └── launch.json # Configuraciones de depuración (opcional)
├── app/
│ ├── __init__.py # Inicialización del módulo de la app
│ ├── main.py # Punto de entrada de la aplicación (alternativo a run.py)
│ ├── ui.py # Definición de la interfaz (UI) de la app
│ ├── server.py # Lógica del servidor (reactividad, callbacks, etc.)
│ ├── modules/ # Componentes o funcionalidades reutilizables
│ │ ├── __init__.py
│ │ ├── dashboard.py # Ejemplo de módulo: dashboard
│ │ └── db_handler.py # Módulo para conexiones y operaciones con la BD
│ └── assets/ # Archivos estáticos (CSS, JS, imágenes)
│ ├── styles.css
│ └── scripts.js
├── config/
│ ├── config.yml # Configuraciones generales (parámetros, rutas, etc.)
│ └── .env # Variables de entorno sensibles (credenciales, API keys)
├── data/
│ ├── raw/ # Datos originales sin procesar
│ ├── interim/ # Datos en proceso de transformación o pruebas
│ └── processed/ # Datos ya limpios/preparados para alimentar la BD
├── scripts/ # Carpeta para análisis y pruebas con archivos .py (IPython)
│ └── analisis_data.py # Script de ejemplo para "simular" celdas con ipykernel
├── tests/
│ ├── __init__.py
│ └── test_app.py # Pruebas unitarias e integración (ej.: usando pytest)
├── run.py # Archivo principal para ejecutar la app
├── .gitignore # Archivos y carpetas a excluir en Git
├── requirements.txt # Dependencias del proyecto
├── README.md # Documentación e introducción del proyecto
└── setup.py # Script de instalación/empaquetado (opcional)
Descripción de la Estructura
app/:main.py: Punto de entrada de la aplicación. También puedes usarrun.pyen la raíz y simplemente importar aquí tu aplicación para mayor claridad.
ui.pyyserver.py: Separar la lógica de UI y server es una buena práctica para hacer más legible y mantenible tu código Shiny.
modules/: Ubica componentes o funcionalidades reutilizables (conexiones a BD, secciones específicas del dashboard, etc.).
assets/: Archivos estáticos (CSS, JS, imágenes) que la app podría necesitar.
config/:config.ymloconfig.jsonpara configuraciones generales.
.envpara credenciales o claves API que no se deben versionar.
- Se recomienda usar librerías como
pyyamlopython-dotenv.
data/:raw/para datos originales.
interim/para datos temporales o en proceso.
processed/para datos listos para la BD o la app.
scripts/:- Aquí trabajas con archivos
.py(en lugar de libretas Jupyter) para hacer pruebas, análisis, o transformaciones de datos. Puedes emular celdas con IPython o ipykernel.
- Aquí trabajas con archivos
tests/:- Ubica aquí tus pruebas unitarias (pytest, unittest, etc.) y validaciones de integración para la aplicación.
run.py:- Archivo sencillo en la raíz del proyecto que llama a tu app. Este patrón es muy común y facilita la ejecución y la detección de la aplicación, tanto en VSCode como en servidores de producción.
# run.py from app.main import app if __name__ == "__main__": app.run().vscode/:- Carpeta con configuraciones de VSCode, como
launch.jsonpara depuración osettings.jsonpara extensiones, formateadores, etc.
- Carpeta con configuraciones de VSCode, como
.gitignore:- Excluye archivos o carpetas sensibles o generados por el sistema (p.ej., entornos virtuales, archivos
.pyc, datos confidenciales).
- Excluye archivos o carpetas sensibles o generados por el sistema (p.ej., entornos virtuales, archivos
requirements.txt:- Lista de dependencias que facilita la instalación del entorno con
pip install -r requirements.txt.
- Lista de dependencias que facilita la instalación del entorno con
README.md:- Explica cómo instalar, configurar y ejecutar la aplicación.
- Incluye cualquier instrucción de despliegue o referencia adicional.
- Explica cómo instalar, configurar y ejecutar la aplicación.
setup.py:- Útil si más adelante deseas empaquetar o distribuir tu aplicación.
- No es obligatorio si manejas la instalación únicamente con
requirements.txt.
- Útil si más adelante deseas empaquetar o distribuir tu aplicación.
Ejemplo de Código Base
app/main.py
from shiny import App
from app.ui import app_ui
from app.server import server
app = App(app_ui, server)
if __name__ == '__main__':
# Puedes correr la app directamente desde `app/main.py`
# o desde `run.py` en la raíz.
app.run()app/ui.py
from shiny import ui
app_ui = ui.page_fluid(
ui.h2("Mi Aplicación Shiny en Python"),
# Más componentes de UI...
)app/server.py
from shiny import render
def server(input, output, session):
@output
@render.text
def saludo():
return "¡Hola desde el servidor!"app/modules/db_handler.py
import sqlalchemy as db
from config.config import get_config # Ejemplo de una función que retorna parámetros
def get_engine():
config = get_config() # Configuración cargada desde config.yml o .env
db_url = config.get('DATABASE_URL')
engine = db.create_engine(db_url)
return engine
def obtener_datos():
engine = get_engine()
connection = engine.connect()
resultado = connection.execute("SELECT * FROM tabla_ejemplo")
datos = [row for row in resultado]
connection.close()
return datosConfiguración en VSCode para la Aplicación Shiny
Entorno Virtual:
- Crea un entorno virtual (
python -m venv venvoconda create -n shiny_env python=3.xx).
- Actívalo y asegúrate de instalar tus dependencias (
pip install -r requirements.txt).
- VSCode detectará el intérprete si lo seleccionas correctamente en la parte inferior derecha (o en el panel de comandos).
- Crea un entorno virtual (
Depuración con
launch.json(opcional):
En.vscode/launch.json, define la configuración de lanzamiento:{ "version": "0.2.0", "configurations": [ { "name": "Python: Run Shiny App", "type": "python", "request": "launch", "program": "${workspaceFolder}/run.py", "console": "integratedTerminal" } ] }Si prefieres apuntar directamente a
app/main.py, modifica la ruta en"program".Plugin de Shiny para Python:
- Si has instalado la extensión de Shiny para Python en VSCode, usualmente detectará el archivo principal (
run.pyoapp/main.py) como la entrada.
- No habrá conflicto con que tu aplicación resida en la carpeta
app/, siempre que la ruta al archivo principal esté bien configurada.
- Si has instalado la extensión de Shiny para Python en VSCode, usualmente detectará el archivo principal (
Recomendaciones Finales
- Modularidad y Reutilización: A medida que tu aplicación crezca, mantén una arquitectura limpia: separa la lógica de datos, la configuración y la interfaz.
- Control de Versiones en GitHub:
- Usa ramas para cada feature/fix y haz pull requests bien documentados.
- Mantén el
.gitignoreactualizado para no subir archivos sensibles o pesados.
- Usa ramas para cada feature/fix y haz pull requests bien documentados.
- Pruebas Automatizadas (CI/CD):
- Configura GitHub Actions u otro sistema de CI para que ejecute
pytest(u otro framework de pruebas) en cada push o pull request.
- Configura GitHub Actions u otro sistema de CI para que ejecute
- Documentación y
README.md:- Explica cómo instalar, configurar y arrancar la app.
- Indica cualquier dependencia externa (por ejemplo, servicios de base de datos o APIs).
- Explica cómo instalar, configurar y arrancar la app.