Aplicación de Flask Modular con Autenticación

Beginner

This tutorial is from open-source community. Access the source code

Introducción

En este laboratorio, mostraremos cómo crear y usar los blueprints de Flask para estructurar tu aplicación utilizando vistas. Los blueprints de Flask te permiten agrupar vistas, código y recursos relacionados, lo que hace que tu aplicación sea modular y escalable. Crearemos una aplicación simple que incluirá la autenticación de usuarios y la funcionalidad de publicaciones de blogs.

Nota: Debes crear el archivo de código por ti mismo y ejecutarlo en el entorno. Puedes previsualizar el estado del servicio Flask en Web 5000.

Crear un blueprint

Comencemos creando un blueprint para nuestra aplicación. Este blueprint se llamará 'auth' y manejará las vistas relacionadas con la autenticación de usuarios. Definiremos nuestro blueprint en un módulo separado llamado flaskr/auth.py.

## flaskr/auth.py

import functools
from flask import Blueprint, flash, g, redirect, render_template, request, session, url_for
from werkzeug.security import check_password_hash, generate_password_hash
from flaskr.db import get_db

## Crea un blueprint llamado 'auth'
bp = Blueprint('auth', __name__, url_prefix='/auth')

Registrar el blueprint

Después de crear el blueprint, debemos registrarlo con nuestra aplicación. Esto se hace en la función de fábrica de la aplicación en flaskr/__init__.py.

## flaskr/__init__.py

def create_app():
    app =...
    ## código existente omitido

    ## Importa y registra el blueprint
    from. import auth
    app.register_blueprint(auth.bp)

    return app

Implementar la vista de registro

Ahora, implementemos la vista de registro en flaskr/auth.py. Esta vista mostrará un formulario de registro y manejará la presentación del formulario.

## flaskr/auth.py

@bp.route('/register', methods=('GET', 'POST'))
def register():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        db = get_db()
        error = None

        if not username:
            error = 'El nombre de usuario es obligatorio.'
        elif not password:
            error = 'La contraseña es obligatoria.'

        if error is None:
            try:
                db.execute(
                    "INSERT INTO user (username, password) VALUES (?,?)",
                    (username, generate_password_hash(password)),
                )
                db.commit()
            except db.IntegrityError:
                error = f"El usuario {username} ya está registrado."
            else:
                return redirect(url_for("auth.login"))

        flash(error)

    return render_template('auth/register.html')

Implementar la vista de inicio de sesión

A continuación, implementaremos la vista de inicio de sesión en flaskr/auth.py. Esta vista manejará la funcionalidad de inicio de sesión de usuario.

## flaskr/auth.py

@bp.route('/login', methods=('GET', 'POST'))
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        db = get_db()
        error = None
        user = db.execute(
            'SELECT * FROM user WHERE username =?', (username,)
        ).fetchone()

        if user is None:
            error = 'Nombre de usuario incorrecto.'
        elif not check_password_hash(user['password'], password):
            error = 'Contraseña incorrecta.'

        if error is None:
            session.clear()
            session['user_id'] = user['id']
            return redirect(url_for('index'))

        flash(error)

    return render_template('auth/login.html')

Implementar la vista de cierre de sesión

Ahora agreguemos una vista de cierre de sesión en flaskr/auth.py. Esta vista manejará la funcionalidad de cierre de sesión de usuario.

## flaskr/auth.py

@bp.route('/logout')
def logout():
    session.clear()
    return redirect(url_for('index'))

Implementar el decorador de inicio de sesión requerido

También necesitaremos un decorador para proteger nuestras vistas que requieren que el usuario esté autenticado. Este decorador se implementará en flaskr/auth.py.

## flaskr/auth.py

def login_required(view):
    @functools.wraps(view)
    def wrapped_view(**kwargs):
        if g.user is None:
            return redirect(url_for('auth.login'))

        return view(**kwargs)

    return wrapped_view

Resumen

En este laboratorio, hemos aprendido cómo usar los blueprints de Flask para estructurar nuestra aplicación. Hemos creado un blueprint para la autenticación de usuarios y hemos implementado vistas de registro, inicio de sesión y cierre de sesión. También hemos implementado un decorador para proteger las vistas que requieren que el usuario esté autenticado. Con este conocimiento, ahora puedes estructurar tus aplicaciones de Flask de manera modular y escalable.