Práctica 2: API
1) Creación de una aplicación web con Flask
A continuación, se crea una aplicación web básica con Flask que permite guardar y leer datos desde un archivo de texto llamado datos.txt. La ruta /guardar?dato=… recibe un parámetro dato, obtiene la IP del cliente (considerando X-Forwarded-For si existe) y la fecha/hora actual, y guarda todo en una sola línea con formato separado por ;. Por otro lado, la ruta /leer abre el archivo y regresa todo su contenido como texto plano. Finalmente, la app se ejecuta con host=”0.0.0.0” para que sea accesible desde otros dispositivos en la red y en el puerto 5500. El código correspondiente se muestra en la sección 1.1.
La estructura de carpetas debe organizarse como se muestra en la Figura 1. Tanto el archivo app.py como el archivo de texto datos.txt deben colocarse en la carpeta principal del proyecto (fuera de .vscode) si se desea que el programa guarde y lea el archivo de texto en la misma ubicación utilizada en el paso anterior.

Figura 1: Estructura del proyecto: archivos app.py y datos.txt en el directorio principal
Nota: En el código si el puerto configurado no funciona, prueba con otro. En este caso, se intentó primero con 5500 sin éxito y posteriormente con 5000, el cual funcionó correctamente.
1.1) app.py
# Step 1: Imports
from flask import Flask, request
from datetime import datetime
# Step 2: Create app
app = Flask(__name__)
# Step 3: File name
FILE_NAME = "datos.txt"
# Step 4: Get client IP
def get_ip():
forwarded = request.headers.get("X-Forwarded-For", "")
if forwarded:
return forwarded.split(",")[0].strip()
return request.remote_addr or "unknown"
# Step 5: Append one line to txt (CSV style)
def append_line(line):
with open(FILE_NAME, "a", encoding="utf-8") as f:
f.write(line + "\n")
# Step 6: Read full txt
def read_lines():
try:
with open(FILE_NAME, "r", encoding="utf-8") as f:
return f.read()
except FileNotFoundError:
return ""
# Step 7: Save by URL: /guardar?dato=hola
@app.get("/guardar")
def guardar():
# Step 7.1: Read query param
dato = (request.args.get("dato") or "").strip()
if dato == "":
return "Error: usa /guardar?dato=algo", 400
# Step 7.2: Build fields
ip = get_ip()
hora = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# Step 7.3: Save as one line: dato,ip,hora
append_line(f"{ip}; {hora}; {dato}")
return f"Guardado ✅: {ip};{hora};{dato}", 200
# Step 8: Read: /leer
@app.get("/leer")
def leer():
text = read_lines()
return text, 200, {"Content-Type": "text/plain; charset=utf-8"}
# Step 9: Run
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=True)
2) Registro y consulta de datos desde el navegador
A continuación se muestra cómo utilizar las rutas del sistema para guardar y leer información en el archivo de texto. La URL http://192.168.0.182:5000/guardar?dato=pruebacasa realiza una petición GET al servidor que está corriendo en la IP 192.168.0.182 y en el puerto 5000 (definido al ejecutar Flask). La ruta /guardar activa la función guardar() del programa y el parámetro dato=pruebacasa (lo que va después de ?) es el valor que se quiere registrar, al entrar a esa ruta, el servidor toma ese dato, obtiene la IP del cliente y la hora, y lo guarda como una nueva línea en datos.txt. En la Figura 5 se observa el proceso de guardado, donde el dato se registra siguiendo la estructura definida en el paso anterior.

Figura 2: Ejemplo de guardado de un dato mediante la ruta /guardar
En cambio, http://192.168.0.182:5000/leer llama la ruta /leer, que ejecuta la función leer() y simplemente lee el contenido completo del archivo datos.txt para mostrarlo en el navegador como texto plano. En la Figura 6 se presenta la lectura del archivo y su contenido, lo cual permite visualizar de forma clara toda la información almacenada.

Figura 3: Visualización del contenido del archivo datos.txt al acceder a la ruta /leer