martes, 25 de marzo de 2025

馃憠 Autenticaci贸n de APIs en Flask con JWT (JSON Web Tokens)

Despu茅s de implementar autenticaci贸n con sesiones en Flask, es momento de aprender una alternativa moderna y escalable: JWT (JSON Web Tokens). Ideal para APIs RESTful.

En este post aprender谩s:
✔️ Qu茅 es JWT y para qu茅 se usa
✔️ C贸mo generar y verificar tokens en Flask
✔️ Proteger rutas con decoradores
✔️ Ejemplo pr谩ctico paso a paso

馃搶 JWT es ampliamente usado en APIs modernas por su seguridad y portabilidad.


1️⃣ ¿Qu茅 es JWT?

JWT (JSON Web Token) es un est谩ndar para transmitir informaci贸n de forma segura entre dos partes.

馃搶 Se compone de 3 partes codificadas en base64:

  • Header (tipo y algoritmo)

  • Payload (datos del usuario)

  • Signature (clave secreta)

✅ Es 煤til para autenticar usuarios sin necesidad de sesiones.


2️⃣ Instalar dependencias

pip install flask flask_sqlalchemy pyjwt

Tambi茅n usaremos werkzeug.security para manejar contrase帽as:

from werkzeug.security import generate_password_hash, check_password_hash

3️⃣ Generar el token JWT al iniciar sesi贸n

import jwt from datetime import datetime, timedelta from flask import Flask, request, jsonify app = Flask(__name__) app.config["SECRET_KEY"] = "clave_super_segura" def generar_token(usuario_id): payload = { "usuario_id": usuario_id, "exp": datetime.utcnow() + timedelta(hours=1) } token = jwt.encode(payload, app.config["SECRET_KEY"], algorithm="HS256") return token

4️⃣ Ruta de Login para devolver un JWT

@app.route("/login", methods=["POST"]) def login(): datos = request.json usuario = Usuario.query.filter_by(email=datos["email"]).first() if usuario and check_password_hash(usuario.password, datos["password"]): token = generar_token(usuario.id) return jsonify({"token": token}) return jsonify({"error": "Credenciales inv谩lidas"}), 401

馃搶 Salida esperada:

{ "token": "eyJhbGciOiJIUzI1NiIsInR..." }

5️⃣ Proteger rutas con un decorador personalizado

from functools import wraps def token_requerido(f): @wraps(f) def decorador(*args, **kwargs): token = request.headers.get("Authorization") if not token: return jsonify({"error": "Token requerido"}), 403 try: datos = jwt.decode(token, app.config["SECRET_KEY"], algorithms=["HS256"]) usuario = Usuario.query.get(datos["usuario_id"]) except: return jsonify({"error": "Token inv谩lido o expirado"}), 403 return f(usuario, *args, **kwargs) return decorador

6️⃣ Ruta protegida usando el token

@app.route("/perfil") @token_requerido def perfil(usuario): return jsonify({ "usuario": usuario.username, "email": usuario.email })

✅ Si el token es v谩lido, se accede al perfil del usuario autenticado.


7️⃣ C贸mo enviar el token desde el cliente

馃搶 En las peticiones protegidas, se debe incluir el token:

GET /perfil HTTP/1.1 Authorization: eyJhbGciOiJIUzI1NiIsInR...

✅ Esto permite que el backend valide al usuario sin usar cookies ni sesiones.


馃殌 Conclusi贸n

✅ JWT es ideal para autenticar usuarios en APIs REST.
✅ Protege tus rutas con decoradores y claves secretas.
✅ A diferencia de Flask-Login, JWT es stateless, perfecto para microservicios.

馃搶 Pr贸ximo post: C贸mo refrescar tokens JWT y controlar expiraci贸n.

馃搨 C贸digo en GitHub: github.com/josecodetech
馃帴 Tutorial en YouTube: https://www.youtube.com/@josecodetech/

馃挰 ¿Ya usaste JWT? ¿Prefieres sesiones o tokens? Cu茅ntamelo 馃憞



viernes, 21 de marzo de 2025

馃憠 Autenticaci贸n de Usuarios en Flask con PostgreSQL y SQLAlchemy

En este post aprender谩s a crear un sistema de autenticaci贸n de usuarios en Flask usando PostgreSQL como base de datos.

Vamos a implementar:
✔️ Registro de nuevos usuarios
✔️ Login con verificaci贸n de credenciales
✔️ Hashing de contrase帽as con Werkzeug
✔️ Mantenimiento de sesi贸n con Flask
✔️ Ejemplo pr谩ctico con rutas protegidas

馃搶 Este es el primer paso para construir aplicaciones web seguras.


1️⃣ Instalar las dependencias necesarias

Aseg煤rate de tener Flask y PostgreSQL ya configurados. Luego, instala:

pip install flask flask_sqlalchemy psycopg2-binary flask_bcrypt flask_login

2️⃣ Configurar la app y la base de datos

from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_bcrypt import Bcrypt from flask_login import LoginManager app = Flask(__name__) app.config["SQLALCHEMY_DATABASE_URI"] = "postgresql://mi_usuario:mi_clave@localhost/mi_app" app.config["SECRET_KEY"] = "clave_secreta_super_segura" db = SQLAlchemy(app) bcrypt = Bcrypt(app) login_manager = LoginManager(app)

3️⃣ Modelo de Usuario con contrase帽a encriptada

from flask_login import UserMixin
class Usuario(db.Model, UserMixin): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(50), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) password = db.Column(db.String(128), nullable=False)

馃搶 Creamos la tabla con:

with app.app_context(): db.create_all()

4️⃣ Registro de nuevos usuarios con contrase帽a encriptada

from flask import request, jsonify @app.route("/registro", methods=["POST"]) def registro(): datos = request.json hashed_password = bcrypt.generate_password_hash(datos["password"]).decode("utf-8") nuevo_usuario = Usuario(username=datos["username"], email=datos["email"], password=hashed_password) db.session.add(nuevo_usuario) db.session.commit() return jsonify({"mensaje": "Usuario registrado con 茅xito"}), 201

馃搶 JSON esperado:

{ "username": "jose", "email": "jose@example.com", "password": "123456" }

5️⃣ Inicio de sesi贸n y validaci贸n de contrase帽a

from flask_login import login_user @app.route("/login", methods=["POST"]) def login(): datos = request.json usuario = Usuario.query.filter_by(email=datos["email"]).first() if usuario and bcrypt.check_password_hash(usuario.password, datos["password"]): login_user(usuario) return jsonify({"mensaje": "Login exitoso"}), 200 return jsonify({"error": "Credenciales incorrectas"}), 401

6️⃣ Rutas protegidas para usuarios logueados

from flask_login import login_required, current_user @app.route("/perfil") @login_required def perfil(): return jsonify({ "usuario": current_user.username, "email": current_user.email })

✅ Esta ruta solo puede ser accedida si el usuario est谩 autenticado.


7️⃣ Cerrar sesi贸n

from flask_login import logout_user @app.route("/logout") @login_required def logout(): logout_user() return jsonify({"mensaje": "Sesi贸n cerrada"})

馃殌 Conclusi贸n

✅ Hemos creado un sistema de registro, login y sesi贸n en Flask.
✅ Las contrase帽as se almacenan encriptadas con Bcrypt.
✅ Flask-Login facilita la autenticaci贸n y la protecci贸n de rutas.

馃搶 Pr贸ximo post: C贸mo integrar JWT para APIs seguras en Flask.

馃搨 C贸digo en GitHub: github.com/josecodetech
馃帴 Tutorial en YouTube: https://www.youtube.com/@josecodetech

馃挰 ¿Qu茅 tipo de autenticaci贸n sueles usar en tus proyectos Flask?



domingo, 16 de marzo de 2025

馃憠 Ejercicios Pr谩cticos con Flask y PostgreSQL en Python

Ya aprendimos a conectar Flask con PostgreSQL. Ahora es momento de poner en pr谩ctica lo aprendido con ejercicios explicados paso a paso.

Hoy resolveremos ejercicios sobre:
✔️ Crear una base de datos PostgreSQL y conectarla a Flask
✔️ Definir modelos con SQLAlchemy
✔️ Construir una API REST para insertar y consultar datos
✔️ Actualizar y eliminar registros en PostgreSQL desde Flask

馃搶 Cada ejercicio incluye c贸digo, explicaci贸n y prueba de salida.


1️⃣ Ejercicio: Crear la Base de Datos y Conectarla con Flask

馃搷 Objetivo: Crear una base de datos PostgreSQL y conectarla a Flask usando SQLAlchemy.

馃搶 C贸digo:

from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # Configurar PostgreSQL en Flask app.config["SQLALCHEMY_DATABASE_URI"] = "postgresql://mi_usuario:mi_clave@localhost/mi_app" app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False db = SQLAlchemy(app) @app.route("/") def home(): return "Conexi贸n exitosa con PostgreSQL" if __name__ == "__main__": app.run(debug=True)

馃搶 Salida esperada en http://127.0.0.1:5000/

Conexi贸n exitosa con PostgreSQL

Este c贸digo establece la conexi贸n entre Flask y PostgreSQL.


2️⃣ Ejercicio: Definir un Modelo para Usuarios en PostgreSQL

馃搷 Objetivo: Crear una tabla usuarios en PostgreSQL con SQLAlchemy.

馃搶 C贸digo:

class Usuario(db.Model): id = db.Column(db.Integer, primary_key=True) nombre = db.Column(db.String(100), nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) # Crear la tabla en PostgreSQL with app.app_context(): db.create_all()

馃搶 Salida esperada:

Tabla usuarios creada en PostgreSQL

Ahora Flask puede almacenar y gestionar usuarios en PostgreSQL.


3️⃣ Ejercicio: Insertar Datos en PostgreSQL desde Flask

馃搷 Objetivo: Crear una API que permita agregar nuevos usuarios.

馃搶 C贸digo:

from flask import request, jsonify @app.route("/usuarios", methods=["POST"]) def agregar_usuario(): datos = request.json nuevo_usuario = Usuario(nombre=datos["nombre"], email=datos["email"]) db.session.add(nuevo_usuario) db.session.commit() return jsonify({"mensaje": "Usuario agregado correctamente"}), 201

馃搶 Ejemplo de JSON enviado en una petici贸n POST:

{ "nombre": "Carlos", "email": "carlos@example.com" }

馃搶 Salida esperada:

{ "mensaje": "Usuario agregado correctamente" }

Ahora los usuarios pueden registrarse desde una API en Flask.


4️⃣ Ejercicio: Consultar Usuarios desde PostgreSQL

馃搷 Objetivo: Obtener una lista de usuarios desde PostgreSQL.

馃搶 C贸digo:

@app.route("/usuarios", methods=["GET"]) def obtener_usuarios(): usuarios = Usuario.query.all() usuarios_json = [ {"id": u.id, "nombre": u.nombre, "email": u.email} for u in usuarios ] return jsonify(usuarios_json)

馃搶 Salida esperada en http://127.0.0.1:5000/usuarios

[ {"id": 1, "nombre": "Carlos", "email": "carlos@example.com"}, {"id": 2, "nombre": "Ana", "email": "ana@example.com"} ]

Ahora la API Flask puede consultar usuarios en PostgreSQL.


5️⃣ Ejercicio: Actualizar Datos de un Usuario

馃搷 Objetivo: Modificar el email de un usuario en PostgreSQL.

馃搶 C贸digo:

@app.route("/usuarios/<int:id>", methods=["PUT"]) def actualizar_usuario(id): datos = request.json usuario = Usuario.query.get_or_404(id) usuario.email = datos["email"] db.session.commit() return jsonify({"mensaje": "Usuario actualizado correctamente"})

馃搶 Ejemplo de JSON enviado en PUT:

{ "email": "nuevoemail@example.com" }

馃搶 Salida esperada:

{ "mensaje": "Usuario actualizado correctamente" }

Permite modificar registros en la base de datos desde Flask.


6️⃣ Ejercicio: Eliminar un Usuario en PostgreSQL

馃搷 Objetivo: Borrar un usuario de la base de datos PostgreSQL.

馃搶 C贸digo:

@app.route("/usuarios/<int:id>", methods=["DELETE"]) def eliminar_usuario(id): usuario = Usuario.query.get_or_404(id) db.session.delete(usuario) db.session.commit() return jsonify({"mensaje": "Usuario eliminado correctamente"})

馃搶 Salida esperada:

{ "mensaje": "Usuario eliminado correctamente" }

Ahora los usuarios pueden ser eliminados desde la API.


馃殌 Conclusi贸n

Flask y PostgreSQL permiten construir APIs escalables en Python.
SQLAlchemy facilita la manipulaci贸n de datos en la base de datos.
Ahora puedes crear, leer, actualizar y eliminar registros en PostgreSQL.

馃搶 Pr贸ximo post: C贸mo autenticar usuarios en Flask con PostgreSQL.

馃搨 C贸digo disponible en mi GitHub: github.com/josecodetech

馃帴 Aprende con mis videos en YouTube: https://www.youtube.com/@josecodetech

馃挰 ¿Has trabajado con PostgreSQL en Flask? ¿Qu茅 tal tu experiencia? Cu茅ntamelo.



jueves, 13 de marzo de 2025

馃憠 Conectando Flask con PostgreSQL para Aplicaciones Web en Producci贸n

En el post anterior, desplegamos nuestra aplicaci贸n Flask con SQLite. Sin embargo, para proyectos m谩s grandes, PostgreSQL es una mejor opci贸n.

Hoy aprender谩s:
✔️ Por qu茅 usar PostgreSQL en vez de SQLite
✔️ C贸mo conectar Flask con PostgreSQL
✔️ Migrar datos de SQLite a PostgreSQL
✔️ Ejemplo paso a paso con SQLAlchemy

馃搶 Al final del tutorial, podr谩s manejar bases de datos PostgreSQL en Flask.


1️⃣ ¿Por qu茅 Usar PostgreSQL en Producci贸n?

馃搶 Diferencias entre SQLite y PostgreSQL:

Caracter铆sticaSQLitePostgreSQL
Uso recomendadoApps peque帽asProyectos grandes
Manejo de datosLocal (archivo)Cliente-servidor
ConcurrenciaLimitadaAlta escalabilidad
Soporte de usuariosNoS铆
Integraci贸n con la nubeNo recomendadaIdeal para producci贸n

馃敼 Usamos PostgreSQL cuando necesitamos:
Alta concurrencia (m煤ltiples usuarios accediendo a la base de datos).
Escalabilidad (mejor rendimiento en grandes vol煤menes de datos).
Despliegue en producci贸n con plataformas en la nube.


2️⃣ Instalar PostgreSQL y Crear una Base de Datos

馃搶 Si no tienes PostgreSQL, inst谩lalo:

馃敼 En Linux (Ubuntu/Debian):

sudo apt update && sudo apt install postgresql postgresql-contrib

馃敼 En Windows:
Descarga desde postgresql.org e instala.

馃搶 Para acceder a PostgreSQL en la terminal:

sudo -i -u postgres
psql

馃搶 Crea una base de datos llamada mi_app:

CREATE DATABASE mi_app;

馃搶 Crea un usuario y otorga permisos:

CREATE USER mi_usuario WITH PASSWORD 'mi_clave';
GRANT ALL PRIVILEGES ON DATABASE mi_app TO mi_usuario;

La base de datos PostgreSQL est谩 lista para usarse con Flask.


3️⃣ Conectar Flask con PostgreSQL

Usaremos SQLAlchemy, el ORM de Flask, para manejar PostgreSQL.

馃搶 Instala las dependencias:

pip install flask flask-sqlalchemy psycopg2-binary

馃搶 Configura Flask para conectarse a PostgreSQL:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # Configurar PostgreSQL en Flask app.config["SQLALCHEMY_DATABASE_URI"] = "postgresql://mi_usuario:mi_clave@localhost/mi_app" app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False db = SQLAlchemy(app) @app.route("/") def home(): return "Conexi贸n exitosa con PostgreSQL" if __name__ == "__main__": app.run(debug=True)

馃搶 Explicaci贸n:
SQLALCHEMY_DATABASE_URI → Define la conexi贸n con PostgreSQL.
db = SQLAlchemy(app) → Inicializa SQLAlchemy en Flask.

馃搶 Ejecuta la aplicaci贸n:

python app.py

Si visitas http://127.0.0.1:5000/ y ves "Conexi贸n exitosa con PostgreSQL", todo est谩 funcionando.


4️⃣ Migrar Datos de SQLite a PostgreSQL

Si tienes datos en SQLite, puedes migrarlos a PostgreSQL f谩cilmente.

馃搶 Pasos para migrar:

1️⃣ Exportar datos desde SQLite:

sqlite3 mi_base.db .dump > backup.sql

2️⃣ Convertir el formato de SQLite a PostgreSQL:
Abre backup.sql en un editor de texto y reemplaza:

  • "AUTOINCREMENT" por "SERIAL"
  • INSERT INTO "tabla" por INSERT INTO tabla

3️⃣ Importar datos en PostgreSQL:

psql -U mi_usuario -d mi_app -f backup.sql

Los datos ahora est谩n en PostgreSQL y listos para usarse con Flask.


5️⃣ Crear una Tabla y Manipular Datos con SQLAlchemy

馃搶 C贸digo para definir y manipular datos en PostgreSQL con SQLAlchemy:

class Usuario(db.Model):
id = db.Column(db.Integer, primary_key=True) nombre = db.Column(db.String(100), nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) # Crear la base de datos y la tabla with app.app_context(): db.create_all()

馃搶 Insertar datos en PostgreSQL desde Flask:

nuevo_usuario = Usuario(nombre="Jos茅", email="jose@example.com")
db.session.add(nuevo_usuario) db.session.commit()

馃搶 Consultar datos en PostgreSQL:

usuarios = Usuario.query.all()
for usuario in usuarios: print(usuario.nombre, usuario.email)

PostgreSQL ahora est谩 completamente integrado con Flask.


馃殌 Conclusi贸n

PostgreSQL es m谩s potente y escalable que SQLite para producci贸n.
SQLAlchemy facilita la conexi贸n entre Flask y PostgreSQL.
Migrar datos de SQLite a PostgreSQL es simple con .dump.

馃搶 Pr贸ximo post: Ejercicios pr谩cticos con Flask y PostgreSQL.

馃搨 C贸digo disponible en mi GitHub: github.com/josecodetech

馃帴 Aprende con mis videos en YouTube: https://www.youtube.com/@josecodetech/

馃挰 ¿Prefieres SQLite o PostgreSQL? Cu茅ntamelo en los comentarios.



mi茅rcoles, 12 de marzo de 2025

馃憠 C贸mo Desplegar una Aplicaci贸n Flask con SQLite en la Nube

Hemos desarrollado una aplicaci贸n web con Flask y SQLite. Ahora es momento de desplegarla en la nube para que cualquier persona pueda acceder a ella.

Hoy aprender谩s:
✔️ Opciones para desplegar Flask en la nube
✔️ C贸mo preparar la aplicaci贸n para producci贸n
✔️ Usar Render o Railway para subir Flask con SQLite
✔️ Ejemplo paso a paso con un despliegue real

馃搶 Con este tutorial, podr谩s publicar tu aplicaci贸n Flask en internet.


1️⃣ Opciones para Desplegar Flask con SQLite

Existen varias opciones para hospedar una aplicaci贸n Flask en la nube. Algunas de las m谩s recomendadas son:

Render → Plataforma gratuita y f谩cil de usar para Flask y SQLite.
Railway → Alternativa moderna con soporte para bases de datos.
Heroku → Requiere configuraciones extra, pero es popular.
VPS (Digital Ocean, AWS, Linode) → M谩s avanzado, pero con mayor control.

Hoy usaremos Render, ya que permite subir Flask con SQLite f谩cilmente.


2️⃣ Preparar la Aplicaci贸n Flask para Producci贸n

Antes de desplegar, debemos crear un entorno virtual y configurar dependencias.

馃搶 Pasos previos:

1️⃣ Crea un entorno virtual en la carpeta de tu proyecto:

python -m venv venv source venv/bin/activate # En Mac/Linux venv\Scripts\activate # En Windows

2️⃣ Instala Flask y dependencias necesarias:

pip install flask gunicorn

3️⃣ Crea un archivo requirements.txt con las dependencias:

pip freeze > requirements.txt

馃搶 Este archivo es necesario para que Render instale las dependencias autom谩ticamente.


3️⃣ Subir la Aplicaci贸n a GitHub

Para desplegar en Render, primero necesitamos subir el proyecto a GitHub.

馃搶 Pasos para subir el c贸digo a un repositorio:

git init git add . git commit -m "Primera versi贸n de la app Flask" git branch -M main git remote add origin https://github.com/tuusuario/tu-repositorio.git git push -u origin main

Ahora el c贸digo est谩 en GitHub y listo para ser desplegado.


4️⃣ Desplegar Flask con SQLite en Render

Render permite ejecutar Flask con bases de datos SQLite f谩cilmente.

馃搶 Pasos para el despliegue:

1️⃣ Ve a Render y crea una cuenta.
2️⃣ En New Web Service, selecciona tu repositorio de GitHub.
3️⃣ En Build Command, escribe:

pip install -r requirements.txt

4️⃣ En Start Command, escribe:

gunicorn -b 0.0.0.0:10000 app:app

5️⃣ Configura el puerto en 10000 y despliega la aplicaci贸n.

馃搶 Despu茅s del proceso, tu aplicaci贸n Flask estar谩 en l铆nea.

Ejemplo de URL:

https://mi-aplicacion-flask.onrender.com

5️⃣ Probar la Aplicaci贸n en Producci贸n

馃搶 Para probar que funciona correctamente, visita:

https://mi-aplicacion-flask.onrender.com/tareas

Si todo est谩 bien, deber铆as ver los datos de SQLite en JSON:

[ {"id": 1, "descripcion": "Aprender Flask", "estado": "Pendiente"}, {"id": 2, "descripcion": "Deploy con Render", "estado": "Completado"} ]

Tu aplicaci贸n Flask con SQLite ahora est谩 accesible en internet.


馃殌 Conclusi贸n

Render permite desplegar Flask con SQLite f谩cilmente.
Configurar dependencias y subir el c贸digo a GitHub es clave.
Una vez en la nube, cualquier persona puede acceder a la API Flask.

馃搶 Pr贸ximo post: C贸mo conectar Flask con una base de datos PostgreSQL en producci贸n.

馃搨 C贸digo disponible en mi GitHub: github.com/josecodetech

馃帴 Aprende con mis videos en YouTube: https://www.youtube.com/@josecodetech

馃挰 ¿Has desplegado una aplicaci贸n Flask antes? ¿Qu茅 plataforma usaste? Cu茅ntamelo.



domingo, 9 de marzo de 2025

馃憠 Ejercicios Pr谩cticos con Flask y SQLite en Python

Ya aprendimos a conectar SQLite con Flask para crear aplicaciones web din谩micas. Ahora es momento de poner en pr谩ctica lo aprendido con ejercicios explicados paso a paso.

Hoy resolveremos ejercicios sobre:
✔️ Conectar Flask con una base de datos SQLite
✔️ Crear una API para insertar y consultar datos
✔️ Actualizar y eliminar registros desde la web
✔️ Ejemplo pr谩ctico con un sistema de gesti贸n de tareas

馃搶 Cada ejercicio incluye c贸digo, explicaci贸n y prueba de salida.


1️⃣ Ejercicio: Crear la Base de Datos SQLite y una Tabla de Tareas

馃搷 Objetivo: Crear una base de datos tareas.db y una tabla tareas.

馃敼 C贸digo:

import sqlite3 conexion = sqlite3.connect("tareas.db") cursor = conexion.cursor() cursor.execute(""" CREATE TABLE IF NOT EXISTS tareas ( id INTEGER PRIMARY KEY AUTOINCREMENT, descripcion TEXT, estado TEXT ) """) conexion.commit() conexion.close() print("Base de datos y tabla de tareas creadas exitosamente.")

馃搶 Salida esperada:

Base de datos y tabla de tareas creadas exitosamente.

Este c贸digo crea la base de datos SQLite con una tabla de tareas.


2️⃣ Ejercicio: Crear una API con Flask para Obtener las Tareas

馃搷 Objetivo: Crear una API con Flask para obtener todas las tareas almacenadas en SQLite.

馃敼 C贸digo:

from flask import Flask, jsonify import sqlite3 app = Flask(__name__) def get_db_connection(): conexion = sqlite3.connect("tareas.db") conexion.row_factory = sqlite3.Row return conexion @app.route("/tareas", methods=["GET"]) def obtener_tareas(): conexion = get_db_connection() cursor = conexion.cursor() cursor.execute("SELECT * FROM tareas") tareas = cursor.fetchall() conexion.close() tareas_json = [{"id": tarea["id"], "descripcion": tarea["descripcion"], "estado": tarea["estado"]} for tarea in tareas] return jsonify(tareas_json) if __name__ == "__main__": app.run(debug=True)

馃搶 Salida esperada en http://127.0.0.1:5000/tareas:

[ {"id": 1, "descripcion": "Terminar proyecto", "estado": "Pendiente"}, {"id": 2, "descripcion": "Enviar informe", "estado": "Completado"} ]

Esta API permite obtener todas las tareas almacenadas en la base de datos.


3️⃣ Ejercicio: Agregar Tareas a la Base de Datos Desde una API

馃搷 Objetivo: Permitir que los usuarios agreguen tareas mediante una API Flask.

馃敼 C贸digo:

from flask import request @app.route("/tareas", methods=["POST"]) def agregar_tarea(): nueva_tarea = request.json conexion = get_db_connection() cursor = conexion.cursor() cursor.execute("INSERT INTO tareas (descripcion, estado) VALUES (?, ?)", (nueva_tarea["descripcion"], nueva_tarea["estado"])) conexion.commit() conexion.close() return jsonify({"mensaje": "Tarea agregada correctamente"}), 201

馃搶 Ejemplo de JSON enviado en una petici贸n POST:

{ "descripcion": "Aprender Flask", "estado": "Pendiente" }

馃搶 Salida esperada:

{ "mensaje": "Tarea agregada correctamente" }

Este c贸digo permite que los usuarios a帽adan tareas a la base de datos.


4️⃣ Ejercicio: Actualizar el Estado de una Tarea

馃搷 Objetivo: Modificar el estado de una tarea en la base de datos.

馃敼 C贸digo:

@app.route("/tareas/<int:id>", methods=["PUT"]) def actualizar_tarea(id): datos = request.json conexion = get_db_connection() cursor = conexion.cursor() cursor.execute("UPDATE tareas SET estado = ? WHERE id = ?", (datos["estado"], id)) conexion.commit() conexion.close() return jsonify({"mensaje": "Tarea actualizada correctamente"})

馃搶 Ejemplo de JSON enviado en una petici贸n PUT:

{ "estado": "Completado" }

馃搶 Salida esperada:

{ "mensaje": "Tarea actualizada correctamente" }

Este c贸digo permite actualizar el estado de una tarea espec铆fica.


5️⃣ Ejercicio: Eliminar una Tarea de la Base de Datos

馃搷 Objetivo: Borrar una tarea de la base de datos SQLite.

馃敼 C贸digo:

@app.route("/tareas/<int:id>", methods=["DELETE"]) def eliminar_tarea(id): conexion = get_db_connection() cursor = conexion.cursor() cursor.execute("DELETE FROM tareas WHERE id = ?", (id,)) conexion.commit() conexion.close() return jsonify({"mensaje": "Tarea eliminada correctamente"})

馃搶 Salida esperada al eliminar una tarea:

{ "mensaje": "Tarea eliminada correctamente" }

脷til para eliminar registros innecesarios.


馃殌 Conclusi贸n

✅ Hoy hemos resuelto ejercicios con Flask y SQLite en Python.
✅ Estos ejercicios permiten crear APIs para gestionar tareas desde una base de datos.
✅ Practica modificando el c贸digo para entenderlo mejor.

馃搶 Pr贸ximo post: C贸mo desplegar una aplicaci贸n Flask con SQLite en la nube.

馃搨 Descarga los ejercicios en mi GitHub: github.com/josecodetech

馃帴 Aprende con mis videos en YouTube: https://www.youtube.com/@josecodetech

馃挰 ¿Te gustar铆a agregar nuevas funciones a este proyecto? ¡Com茅ntalo!



viernes, 7 de marzo de 2025

馃憠 Conectando SQLite con una Aplicaci贸n Web en Python: Flask y Bases de Datos

 

Hemos aprendido a manejar bases de datos SQLite en Python. Ahora daremos un paso m谩s: conectar SQLite con una aplicaci贸n web usando Flask.

Hoy aprender谩s:
✔️ ¿Qu茅 es Flask y por qu茅 usarlo?
✔️ C贸mo conectar Flask con SQLite
✔️ Crear una API para interactuar con la base de datos
✔️ Consultar y mostrar datos en una p谩gina web
✔️ Ejemplo pr谩ctico paso a paso

馃搶 Con este tutorial, podr谩s construir aplicaciones web din谩micas con bases de datos.


1️⃣ ¿Qu茅 es Flask y por qu茅 usarlo?

Flask es un framework ligero para crear aplicaciones web en Python.

馃搶 Ventajas de Flask:
✅ F谩cil de aprender y usar
✅ Permite crear APIs y p谩ginas web din谩micas
✅ Compatible con bases de datos como SQLite
✅ Ideal para proyectos peque帽os y medianos

Para instalar Flask, ejecuta:

pip install flask

2️⃣ Conectar Flask con SQLite

El primer paso es crear un archivo app.py y configurar la conexi贸n con SQLite.

馃搶 C贸digo para conectar Flask con SQLite:

from flask import Flask, g
import sqlite3 app = Flask(__name__) DATABASE = "mi_base.db" def get_db(): db = getattr(g, "_database", None) if db is None: db = g._database = sqlite3.connect(DATABASE) return db @app.teardown_appcontext def close_connection(exception): db = getattr(g, "_database", None) if db is not None: db.close()

馃搶 Explicaci贸n:
sqlite3.connect(DATABASE) → Conecta SQLite con Flask.
get_db() → Obtiene la conexi贸n a la base de datos.
@app.teardown_appcontext → Cierra la conexi贸n cuando termina la petici贸n.


3️⃣ Crear una API con Flask y SQLite

Vamos a crear una API REST que devuelva los datos almacenados en SQLite.

馃搶 C贸digo para obtener todos los registros de una tabla productos:

from flask import jsonify
@app.route("/productos", methods=["GET"]) def get_productos(): db = get_db() cursor = db.cursor() cursor.execute("SELECT * FROM productos") productos = cursor.fetchall() productos_json = [ {"id": p[0], "nombre": p[1], "precio": p[2], "stock": p[3]} for p in productos ] return jsonify(productos_json)

馃搶 Explicaci贸n:
@app.route("/productos") → Define una ruta para obtener los productos.
jsonify(productos_json) → Devuelve los datos en formato JSON.

馃搶 Salida esperada al visitar http://127.0.0.1:5000/productos en el navegador:

[
{"id": 1, "nombre": "Laptop", "precio": 1200.5, "stock": 10}, {"id": 2, "nombre": "Mouse", "precio": 25.99, "stock": 50} ]

4️⃣ Insertar Datos desde una API Flask

Tambi茅n podemos permitir que los usuarios env铆en datos a la base de datos.

馃搶 C贸digo para insertar productos en la base de datos:

from flask import request
@app.route("/productos", methods=["POST"]) def add_producto(): nuevo_producto = request.json db = get_db() cursor = db.cursor() cursor.execute("INSERT INTO productos (nombre, precio, stock) VALUES (?, ?, ?)", (nuevo_producto["nombre"], nuevo_producto["precio"], nuevo_producto["stock"])) db.commit() return jsonify({"mensaje": "Producto agregado correctamente"}), 201

馃搶 Explicaci贸n:
request.json → Recibe los datos enviados en formato JSON.
INSERT INTO productos (...) VALUES (...) → Inserta un nuevo registro en la base de datos.

馃搶 Ejemplo de JSON enviado en una petici贸n POST:

{
"nombre": "Teclado", "precio": 45.75, "stock": 30 }

El producto se agregar谩 a la base de datos y la API responder谩 con un mensaje de 茅xito.


5️⃣ Mostrar los Datos en una P谩gina Web con Flask y SQLite

Flask tambi茅n nos permite mostrar los datos en una p谩gina HTML en lugar de JSON.

馃搶 C贸digo para mostrar los productos en una plantilla HTML:

from flask import render_template
@app.route("/") def index(): db = get_db() cursor = db.cursor() cursor.execute("SELECT * FROM productos") productos = cursor.fetchall() return render_template("index.html", productos=productos)

馃搶 Plantilla templates/index.html:

<!DOCTYPE html>
<html> <head> <title>Lista de Productos</title> </head> <body> <h1>Productos Disponibles</h1> <ul> {% for producto in productos %} <li>{{ producto[1] }} - Precio: {{ producto[2] }} USD - Stock: {{ producto[3] }}</li> {% endfor %} </ul> </body> </html>

馃搶 Explicaci贸n:
render_template("index.html") → Carga una plantilla HTML.
{% for producto in productos %} → Muestra cada producto en la p谩gina.

馃搶 Salida esperada en el navegador:

Productos Disponibles
- Laptop - Precio: 1200.5 USD - Stock: 10 - Mouse - Precio: 25.99 USD - Stock: 50

Esta p谩gina muestra los productos almacenados en SQLite.


馃殌 Conclusi贸n

Flask permite conectar aplicaciones web con SQLite en Python.
Podemos crear APIs REST para interactuar con la base de datos.
Los datos pueden mostrarse en formato JSON o en una p谩gina HTML.

馃搶 Pr贸ximo post: Ejercicios pr谩cticos con Flask y SQLite en Python.

馃搨 C贸digo disponible en mi GitHub: github.com/josecodetech

馃帴 Aprende con mis videos en YouTube: https://www.youtube.com/@josecodetech

馃挰 ¿Has trabajado con bases de datos en aplicaciones web? Cu茅ntamelo.