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.