Proyecto - Gestión de Archivos

Usar un Único Entorno Virtual Python (venv)

Puedes usar un único entorno virtual (venv) para múltiples proyectos, pero debes ser disciplinado en la gestión de dependencias para evitar conflictos.

1- Crea el entorno virtual: 

 En la carpeta donde deseas centralizar tus proyectos, crea el entorno virtual.

mkdir ~/proyectos
cd ~/proyectos
python3 -m venv venvirtual

Creando directorio y subdirectorio del proyecto 1: 

Opción 1: Método paso a paso

  1. Crea un directorio llamado gestion-archivos
  2. mkdir gestion-archivos 
  3. Navega al directorio recién creado:
  4. cd gestion-archivos 
  5. Crea el archivo server.js dentro del directorio:
  6. touch server.js 
  7. Crea el archivo index.html dentro del directorio:
  8.  touch index.html 

Opcion 2: Todo en una sola línea de comando utilizando && :

 mkdir gestion-archivos && cd gestion-archivos && touch server.js index.html

Opcion 3: Todo en una sola línea de comando utilizando && y llaves {}:

 mkdir gestion-archivos && { cd gestion-archivos && touch server.js index.html; }

2- Activar el entorno virtual:  

 Antes de trabajar en cualquier proyecto, activa el entorno:

source ~/proyectos/venvirtual/bin/activate 

Verás que el nombre del entorno aparece en tu terminal. Por ejemplo: (venv). En nuestro caso lo llamamos: (venvirtual)

 (venvirtual) user@user:~/proyectos$ 

Estructura de arbol: tree
Para Instalar la estructura de arbol intalar:

sudo apt install tree 
Luego ejecutar el comando: tree
tree 
Veras la estructura de arbol de proyectos, donde se encuentra instalado venv (venvirtual)
(venvirtual) user@user:~/proyectos$ tree
.
├── gestion-archivos
│   ├── index.html
│   └── server.js
└── venvirtual
    ├── bin
    │   ├── activate
    │   ├── activate.csh
    │   ├── activate.fish
    │   ├── Activate.ps1
    │   ├── pip
    │   ├── pip3
    │   ├── pip3.12
    │   ├── python -> python3
    │   ├── python3 -> /usr/bin/python3
    │   └── python3.12 -> python3
    ├── include
    │   └── python3.12
    ├── lib
    │   └── python3.12
    │       └── site-packages
    │           ├── pip
    │           │   ├── __init__.py
    │           │   ├── _internal
    
    │           └── pip-24.0.dist-info
    │               ├── AUTHORS.txt
    │               ├── entry_points.txt
    │               ├── INSTALLER
    │               ├── LICENSE.txt
    │               ├── METADATA
    │               ├── RECORD
    │               ├── REQUESTED
    │               ├── top_level.txt
    │               └── WHEEL
    ├── lib64 -> lib
    └── pyvenv.cfg 
 
 

Configuracion del Backend y Frontend

 

1. Instalar Node.js y npm

Abrir una nueva terminal: CTRL + ALT + T

Descargar e Instalar Node.js:  Sigue los pasos de instalación según tu sistema operativo (Windows, macOS, Linux).Confirmar la instalación: Esto mostrará las versiones instaladas de node.js y npm estén. 

node -v
npm -v

 

2. Configurar el Backend

2.1- Crea la carpeta del proyecto 1:  gestion-archivos

En tu terminal, navega a la ubicación de tu entorno de trabajo y crea la carpeta del proyecto:
mkdir gestion-archivos
cd gestion-archivos
user@user:~$ cd proyectos/gestion-archivos

2.2 Inicializa un proyecto Node.js:

Ejecuta el siguiente comando para inicializar un archivo package.json:

npm init -y

Esto crea un archivo package.json con configuración básica. Ejemplo de este caso.

user@user:~/proyectos/gestion-archivos$ npm init -y
Wrote to /home/user/proyectos/gestion-archivos/package.json:

{
  "name": "gestion-archivos",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node server.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "type": "commonjs"
}

2.3- Instalar Express:

Instala el paquete Express para manejar el backend:

npm install express

Esto va ha generar un package-lock.json y la carpeta node_modules

2.4- Crear el archivo del servidor:

En la carpeta del proyecto, crea un archivo llamado server.js con el siguiente contenido:

const express = require("express");
const fs = require("fs");
const path = require("path");

const app = express();
app.use(express.json()); // Permitir JSON en las solicitudes

// Servir archivos estáticos como index.html desde el directorio actual
app.use(express.static(__dirname)); 

// Ruta de la carpeta htdocs
const htdocsPath = path.join(__dirname, "htdocs");

// Crear la carpeta `htdocs` si no existe
if (!fs.existsSync(htdocsPath)) {
  fs.mkdirSync(htdocsPath);
}

// Endpoint para crear archivos
app.post("/create-file", (req, res) => {
  const { fileName, content } = req.body;

  if (!fileName) {
    return res.status(400).send("El nombre del archivo es obligatorio.");
  }

  const filePath = path.join(htdocsPath, fileName);

  fs.writeFile(filePath, content || "", (err) => {
    if (err) {
      return res.status(500).send("Error al crear el archivo.");
    }
    res.send("Archivo creado exitosamente.");
  });
});

// Endpoint para listar archivos
app.get("/list-files", (req, res) => {
  fs.readdir(htdocsPath, (err, files) => {
    if (err) {
      return res.status(500).send("Error al listar archivos.");
    }
    res.json(files);
  });
});

// Configurar el puerto del servidor
const PORT = 3000;
app.listen(PORT, () => {
  console.log(`Servidor corriendo en http://localhost:${PORT}`);
});

Ejecutar el backend:

En la terminal, ejecuta:

  • node server.js
    

    Esto iniciará el servidor en http://localhost:3000

     

    3. Configurar el Frontend

    Crear los archivos del frontend:  En la carpeta del proyecto, crea un archivo llamado index.html con el siguiente contenido. 

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Gestión de Archivos</title>
      <style>
        body {
          font-family: Arial, sans-serif;
          margin: 20px;
        }
        .button {
          margin: 10px;
          padding: 10px 20px;
          background-color: #4CAF50;
          color: white;
          border: none;
          border-radius: 5px;
          cursor: pointer;
        }
        .button:hover {
          background-color: #45a049;
        }
        textarea {
          width: 100%;
          height: 100px;
          margin-top: 10px;
        }
      </style>
    </head>
    <body>
      <h1>Gestión de Archivos</h1>
      <div>
        <label>Nombre del archivo:</label>
        <input type="text" id="fileName" placeholder="archivo.txt">
        <textarea id="fileContent" placeholder="Escribe contenido aquí..."></textarea>
        <button class="button" onclick="createFile()">Crear Archivo</button>
      </div>
      <div>
        <button class="button" onclick="listFiles()">Listar Archivos</button>
        <ul id="fileList"></ul>
      </div>
    
      <script>
        const API_URL = "http://localhost:3000"; // Asegúrate de que esto coincida con el backend
    
        function createFile() {
          const fileName = document.getElementById("fileName").value;
          const content = document.getElementById("fileContent").value;
    
          fetch(`${API_URL}/create-file`, {
            method: "POST",
            headers: { "Content-Type": "application/json" },
            body: JSON.stringify({ fileName, content })
          })
            .then(response => response.text())
            .then(data => alert(data))
            .catch(error => console.error("Error:", error));
        }
    
        function listFiles() {
          fetch(`${API_URL}/list-files`)
            .then(response => response.json())
            .then(files => {
              const fileList = document.getElementById("fileList");
              fileList.innerHTML = ""; // Limpiar la lista
              files.forEach(file => {
                const li = document.createElement("li");
                li.textContent = file;
                fileList.appendChild(li);
              });
            })
            .catch(error => console.error("Error:", error));
        }
      </script>
    </body>
    </html>
    

    Abrir el frontend:

    Abre el archivo index.html en tu navegador.
    http://localhost:3000/index.html

    4. Probar el Proyecto

    Inicia el backend con:
    node server.js
    
    Abre el archivo index.html en tu navegador.

    http://localhost:3000/index.html 

    • Usa la interfaz para crear archivos, listarlos y verificar que todo funciona correctamente.

     

    Cómo funciona el http://localhost:3000

    La URL http://localhost:3000 corresponde al backend (servidor) que configuraste utilizando Node.js. Aquí es donde se están ejecutando los endpoints que creaste (como /create-file o /list-files). Vamos a desglosarlo:

    • localhost: Representa tu propia computadora (también llamado "host local").
    • 3000: Es el número del puerto donde está corriendo tu servidor
  • Cuando el servidor está activo, puedes acceder a los endpoints escribiendo directamente en el navegador: http://localhost:3000

    • Si no configuraste un mensaje de bienvenida en tu backend, la página puede quedar en blanco (¡pero esto es normal!).

    Para probar un endpoint específico: Si configuraste un endpoint para listar archivos, puedes escribir:    http://localhost:3000/list-files

    Esto mostrará la lista de archivos en formato JSON.

     

    ¿Cómo interactúan el backend (localhost) y el frontend ?

    Cuando abras el archivo index.html en el navegador, este archivo enviará solicitudes al backend (que está corriendo en http://localhost:3000) para realizar acciones como crear, listar o editar archivos.

    Flujo de ejemplo:

    1. Abre index.html en tu navegador. http://localhost:3000/index.html
    2. Escribe el nombre y contenido de un archivo en los campos correspondientes y presiona el botón "Crear Archivo".
    3. El frontend (index.html) enviará una solicitud al backend, usando la URL http://localhost:3000/create-file.
    4. El backend recibirá la solicitud, creará el archivo en la carpeta htdocs, y devolverá una respuesta que se mostrará en tu navegador.

     

    ¿Cómo saber si el servidor está funcionando correctamente en el navegador ?

     Asegúrate de que tu servidor está corriendo antes de hacer pruebas:  

    node server.js

    Si el servidor está corriendo, usar el navegador: Acceder al backend (probando un endpoint). 

    http://localhost:3000/list-files

    Para abrir el frontend: Sigue las opciones (doble clic, arrastrar, etc.) para abrir index.html.

     

    Nota adicional sobre servidores web locales

    Si necesitas una conexión más integrada entre el frontend y el backend (en lugar de abrir index.html directamente desde tu archivo), puedes usar herramientas como live-server o configurar tu backend para servir el archivo HTML directamente.

    Por ejemplo, en tu archivo server.js, podrías agregar esta línea:

    // Sirve archivos estáticos como index.html
      app.use(express.static(__dirname)); 
    

    Después, puedes acceder al frontend escribiendo en tu navegador: http://localhost:3000/index.html 

    Dónde incluir app.use(express.static(__dirname));

    En tu archivo server.js, debes colocar esta línea cerca de la parte superior, antes de definir cualquier endpoint.

    Cómo usar el frontend con esta configuración

    Con esta línea incluida, puedes abrir el frontend directamente desde la URL del servidor (http://localhost:3000/index.html), y no necesitas arrastrar ni abrir manualmente el archivo en tu navegador.

    Pasos:

    1.  Ejecuta el servidor: node server.js 
    2. El servidor debería estar corriendo en http://localhost:3000
    3. Accede al frontend: http://localhost:3000/index.html
    4. Esto abrirá el archivo index.html directamente desde el servidor.

     

    Ventajas de esta configuración

    • Centralización: Backend y frontend están gestionados desde el servidor, lo que facilita las pruebas.
    • Consistencia: Puedes integrar fácilmente otros recursos (CSS, imágenes, etc.) desde el mismo servidor.
    • Practicidad: Evitas manejar manualmente los archivos del frontend.
     

    Estructura esperada del proyecto (Tree)

    Tu proyecto gestion-archivos debería estar organizado de la siguiente manera:

    gestion-archivos/
    ├── htdocs/                    # Carpeta creada automáticamente por el backend
    ├── server.js                  # Archivo principal del backend
    ├── index.html                 # Interfaz del frontend
    ├── package.json               # Archivo de configuración de Node.js
    ├── package-lock.json          # Archivo generado automáticamente por npm
    ├── node_modules/              # Dependencias instaladas con npm
     

    Detalles de cada elemento:

    1. htdocs/:  Carpeta donde se guardarán los archivos creados desde el frontend. El backend crea esta carpeta automáticamente si no existe.
    2. server.js:  Contiene el código del backend. Este archivo debe estar ejecutándose con node server.js.
    3. index.html: Archivo que representa la interfaz del usuario. Se abre en el navegador para interactuar con el servidor.
    4. package.json:   Archivo generado por npm init -y que gestiona las dependencias del proyecto.
    5. node_modules/:  Carpeta que contiene las dependencias instaladas por npm.
  •  


     

    Ejemplo Práctico 2: Proyecto "Gestión de Archivos"

    Estructura de Carpetas:

    ~/proyectos/
        ├── venvirtual/
        ├── gestion-archivos/
        │   ├── server.py
        │   ├── index.html
        │   ├── gestion-archivos-requirements.txt
        ├── proyecto-dos/
        │   ├── app.py
        │   ├── proyecto-dos-requirements.txt
    

    Comandos para Gestión de Dependencias:

    1- Activa el entorno:

     source ~/proyectos/venvirtual/bin/activate
    

    2- Instala las dependencias del proyecto "Gestión de Archivos":

    cd ~/proyectos/gestion-archivos
    pip install -r gestion-archivos-requirements.txt
    

    3- Instala dependencias para un nuevo proyecto:

    cd ~/proyectos/proyecto-dos
    pip install -r proyecto-dos-requirements.txt
    

    Ventajas de Usar un Único venv o VM

      • Ahorro de espacio en disco al evitar múltiples entornos virtuales.
      • Facilidad de administración al centralizar los proyectos.
      • Flexibilidad para probar diferentes configuraciones sin afectar el sistema principal.




    • Destacado

      Bootloader Avanzado en Ensamblador

      Bootloader Avanzado en Ensamblador Características del Bootloader Se carga en la dirección 0x7C00 (BIOS). ...