Aplicación web construida con Flask que permite gestionar alumnos, cursos e inscripciones para la emisión de certificados académicos. Incluye portal público para estudiantes y panel privado para administradores.
- Python 3.10+
- pip
- 
Crea y activa un entorno virtual opcional. 
- 
Instala las dependencias: pip install -r requirements.txt 
- 
Ejecuta la aplicación (por defecto se expone en http://127.0.0.1:5000):flask --app app run --debug 
- 
Abre el navegador y visita la ruta base para acceder a las vistas públicas. 
Al iniciarse por primera vez se crea una base de datos SQLite (sistemadecursos.db) y un usuario administrador por defecto con el código admin123.
Los certificados subidos se almacenan en la carpeta uploaded_certificates/ y se entregan mediante una URL segura.
- Registrar un alumno: ingresa a http://127.0.0.1:5000/registro, completa el formulario y guarda. Serás redirigido al inicio de sesión.
- Acceder como alumno: en http://127.0.0.1:5000/accesoselecciona "Soy Alumno", escribe el DNI registrado y entra al portal donde se listan tus cursos.
- Acceder como administrador: en la misma página selecciona "Administrador" e introduce el código admin123(o el configurado enDEFAULT_ADMIN_CODE).
- Crear datos de ejemplo: desde el panel administrativo puedes registrar alumnos, crear cursos y asignar certificados PDF para verificar el flujo completo.
Si deseas que la aplicación esté disponible en tu red local, ejecuta flask --app app run --host 0.0.0.0 --port 5000 y accede usando la IP de tu máquina.
- 
Crea un repositorio vacío llamado, por ejemplo, sistemadecursosen tu cuenta de GitHub.
- 
Abre una terminal en la carpeta del proyecto y verifica que Git reconozca los archivos modificados: git status 
- 
Si es la primera vez que usas Git en esta carpeta, inicializa el repositorio y agrega todo el contenido: git init git add .Si ya estaba inicializado, basta con ejecutar git add .para preparar los cambios recientes.
- 
Crea un commit con un mensaje descriptivo (por ejemplo, "Prepara sistema de certificados"): git commit -m "Prepara sistema de certificados"
- 
Enlaza tu repositorio local con el remoto recién creado en GitHub: git remote add origin https://github.com/<TU_USUARIO>/sistemadecursos.git Si ya tenías configurado el remoto, confirma su URL con git remote -v.
- 
Define maincomo rama principal (o usamastersi prefieres ese nombre) y sube el commit:git branch -M main git push -u origin main 
- 
A partir de aquí, cada vez que hagas cambios repite git add .,git commit -m "mensaje"ygit pushpara publicarlos.
Si en GitHub aparece un aviso de conflictos (por ejemplo, al abrir un Pull Request), significa que tu rama local no incorpora los últimos cambios del remoto. Para solucionarlo:
- 
Asegúrate de estar en la rama que quieres sincronizar (por ejemplo, main):git checkout main 
- 
Descarga los cambios más recientes del remoto e intégralos. Lo más sencillo es usar git pull --rebasepara mantener un historial limpio:git pull --rebase origin main 
- 
Si Git indica que hay conflictos en archivos concretos, ábrelos, busca las marcas <<<<<<<,=======,>>>>>>>y edítalos dejando solo la versión correcta. Luego marca los archivos como resueltos:git add <archivo_en_conflicto> 
- 
Cuando todos los conflictos estén resueltos, continúa el rebase o el merge que se estaba realizando (Git lo indicará en la terminal). Habitualmente bastará con ejecutar: git rebase --continue o, si estabas haciendo un merge, simplemente termina congit commit.
- 
Finalmente, publica la rama actualizada: git push --force-with-lease Usa --force-with-leasesolo cuando hayas hecho rebase. Si utilizastegit pullsin rebase, ungit pushnormal será suficiente.
Tras este proceso, la advertencia desaparecerá y GitHub permitirá completar el merge.
💡 No subas
sistemadecursos.dbsi ya existe; puedes agregarlo al.gitignorepara mantener privados tus datos.
- 
Crea una cuenta en https://render.com e inicia sesión. 
- 
En el panel de Render haz clic en New → Web Service y conecta tu cuenta de GitHub. 
- 
Autoriza el acceso a tu repositorio sistemadecursosy selecciónalo.
- 
Configura el servicio con los siguientes valores: - Runtime: Python 3
- Build Command: pip install -r requirements.txt
- Start Command: gunicorn --bind 0.0.0.0:10000 app:app
- Region: la más cercana a tus usuarios
 Render detecta automáticamente que la aplicación escucha en el puerto 10000(configúralo en la sección Advanced si es necesario).
- 
En la sección Environment agrega, si lo deseas, variables como SECRET_KEYyDEFAULT_ADMIN_CODE.
- 
Haz clic en Create Web Service. Render clonará el repositorio, instalará las dependencias y lanzará la aplicación. El primer despliegue puede tardar varios minutos. 
- 
Cuando el estado pase a Live, verás una URL pública similar a https://sistemadecursos.onrender.com. Úsala para acceder al sistema.
Para futuros cambios, solo haz git push a la rama principal; Render desplegará automáticamente la versión más reciente.
- Regístrate en https://railway.app y entra al panel.
- Selecciona New Project → Deploy from GitHub repo y autoriza el acceso a tu repositorio sistemadecursos.
- Railway detectará que es una aplicación Flask y configurará la imagen automáticamente. Si usas SQLite no necesitas pasos adicionales.
- En la pestaña Variables puedes definir SECRET_KEY,DEFAULT_ADMIN_CODEu otras variables.
- Al finalizar el despliegue obtendrás una URL pública del tipo https://sistemadecursos-production.up.railway.app.
Si necesitas mayor control o escalar el proyecto, evalúa estas alternativas:
- Google Cloud Run o AWS Elastic Beanstalk utilizando un contenedor Docker con Gunicorn (ya incluido en requirements.txt).
- Microsoft Azure App Service con un startup command similar al de Render.
- Vercel empleando un adaptador WSGI como vercel-python-wsgi.
En todos los casos asegúrate de:
- Mantener SECRET_KEYyDEFAULT_ADMIN_CODEcomo variables de entorno.
- Configurar el puerto y host de escucha según los requisitos del proveedor.
- Servir los certificados desde un almacenamiento seguro (puede ser un bucket en la nube si tu proveedor no permite escritura en disco).
- app.py: aplicación Flask con rutas de alumno y administrador.
- templates/: vistas HTML (registro, acceso, portal alumno, panel admin).
- static/css/: estilos personalizados.
- uploaded_certificates/: almacenamiento de certificados PDF.
- Variable de entorno SECRET_KEYpara la sesión de Flask.
- Variable de entorno DEFAULT_ADMIN_CODEpara establecer otro código inicial de administrador.