Registro y autenticación de usuarios con web.py

Código de fuente de una aplicación web que implementa un sistema de autenticación. Incorpora una versión simple de un registro, iniciar y cerrar sesión. Hace uso del sistema de base de datos SQLite, cookies y templates del framework; junto con el módulo hashlib para cifrar las contraseñas con MD5.

Descargar: código de fuente completo

Recuerda descargar el código completo para ejecutar el ejemplo.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#       main.py
#       
#       Copyright 2013 Recursos Python - www.recursospython.com
#       
#       

from hashlib import md5

import web

urls = (
    "/", "Index",
    "/signup", "SignUp",
    "/logout", "LogOut"
)

app = web.application(urls, globals())
render = web.template.render("templates")

class Index:
    """Página principal"""
    
    def GET(self):
        cookies = web.cookies()
        username = cookies.get("webusername")
        
        # Debería realizarse una comprobación del hash de la cookie
        # con el de la base de datos.
        
        return render.index(username)
    
    def POST(self):
        """Ingresar usuario"""
        i = web.input()
        
        # Buscar el usuario en la bd
        # Argumento 'vars' para prevenir inyecciones SQL
        db = web.database(dbn="sqlite", db="users.db")
        q = db.select("users", where="username=$username",
                      what="password", vars={"username": i.username})
        
        if q:
            db_password = list(q)[0]["password"]
            if db_password == md5(i.password).hexdigest():
                web.setcookie("webusername", i.username)
                web.setcookie("webpassword", db_password)
                web.seeother("/")
            else:
                return "Usuario o clave incorrecto."
        else:
            return "Usuario o clave incorrecto."

class SignUp:
    """Formulario de registro"""
    
    def GET(self):
        return render.signup()
    
    def POST(self):
        """Crear usuario"""
        i = web.input()
        
        # Verificar que se hayan ingresado los campos.
        if not i.username or not i.password:
            return "Ingrese todos los datos."
        
        # Abrir la base de datos y añadir un nuevo usuario.
        # Los cambios se guardan automáticamente (commit).
        db = web.database(dbn="sqlite", db="users.db")
        db.insert("users", username=i.username,
                  password=md5(i.password).hexdigest())
        
        web.seeother("/")

class LogOut:
    """Cerrar sesión"""
    
    def GET(self):
        # expires=-1 remueve la cookie
        web.setcookie("webusername", "", expires=-1)
        web.setcookie("webpassword", "", expires=-1)
        web.seeother("/")

if __name__ == "__main__":
    app.run()

Curso online 👨‍💻

¡Ya lanzamos el curso oficial de Recursos Python en Udemy! Un curso moderno para aprender Python desde cero con programación orientada a objetos, SQL y tkinter en 2024.

Consultoría 💡

Ofrecemos servicios profesionales de desarrollo y capacitación en Python a personas y empresas. Consultanos por tu proyecto.

Deja una respuesta