Spaces:
Sleeping
Sleeping
File size: 3,438 Bytes
e09caf0 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | from flask import Blueprint, render_template, request, redirect, url_for, session, flash
from models.usuario import UsuarioModel
import random
import string
import base64
from io import BytesIO
from captcha.image import ImageCaptcha # Librer铆a para generar im谩genes captcha
# Blueprint para Autenticaci贸n (Login/Logout)
auth_bp = Blueprint('auth', __name__)
model = UsuarioModel()
# Funci贸n para generar un captcha de imagen mas moderno
def generar_captcha_imagen():
# Generar una cadena aleatoria de 4 caracteres (letras y n煤meros)
caracteres = string.ascii_uppercase + string.digits
captcha_text = ''.join(random.choice(caracteres) for _ in range(4))
session['captcha_text'] = captcha_text # Guardar en sesi贸n para validar
# Crear la imagen con la librer铆a
image = ImageCaptcha(width=200, height=80)
data = image.generate(captcha_text)
# Convertir la imagen a Base64 para enviarla al HTML sin archivos temporales
buffered = BytesIO()
buffered.write(data.getvalue())
img_str = base64.b64encode(buffered.getvalue()).decode()
return f"data:image/png;base64,{img_str}"
# Ruta para Login
@auth_bp.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
# Validar Captcha Primero
captcha_user = request.form.get('captcha_input', '').upper()
if not captcha_user or captcha_user != session.get('captcha_text'):
flash('C贸digo de seguridad incorrecto. Int茅ntalo de nuevo.')
return redirect(url_for('auth.login'))
usuario = request.form['usuario']
password = request.form['password']
user = model.login(usuario, password)
if user:
session['user_id'] = user['idusuario']
session['username'] = user['usuario']
return redirect(url_for('persona.index'))
else:
flash('Usuario o contrase帽a incorrectos')
captcha_img = generar_captcha_imagen()
return render_template('login.html', captcha_img=captcha_img)
# Ruta para Registro
@auth_bp.route('/registro', methods=['GET', 'POST'])
def registro():
if request.method == 'POST':
# Validar Captcha
captcha_user = request.form.get('captcha_input', '').upper()
if not captcha_user or captcha_user != session.get('captcha_text'):
flash('C贸digo de seguridad incorrecto. Int茅ntalo de nuevo.')
return render_template('registro.html', captcha_img=generar_captcha_imagen())
usuario = request.form['usuario']
password = request.form['password']
confirm_password = request.form['confirm_password']
if password != confirm_password:
flash('Las contrase帽as no coinciden')
else:
success, message = model.registrar(usuario, password)
if success:
flash(message)
return redirect(url_for('auth.login'))
else:
flash(message)
captcha_img = generar_captcha_imagen()
return render_template('registro.html', captcha_img=captcha_img)
# Ruta para cerrar sesi贸n
@auth_bp.route('/logout')
def logout():
# Limpiar todos los datos de la sesi贸n
session.clear()
# Redirigir al login
return redirect(url_for('auth.login'))
|