Conceptos básicos de Flask

En el capítulo anterior aprendimos a crear la primera aplicación Flask. En este capítulo exploraremos en detalle algunos conceptos básicos de Flask.

Comprender los conceptos básicos de Flask es muy importante para desarrollar aplicaciones web eficientes.

A continuación se presenta un análisis detallado de los principales conceptos básicos de Flask:

  • Enrutamiento: El enrutamiento es la asignación de URL a funciones de Python. Flask te permite definir rutas, de modo que cuando se accede a una URL específica, se llama a la función correspondiente.

  • Funciones de vista: Las funciones de vista son funciones de Python que procesan solicitudes y devuelven respuestas. Normalmente reciben el objeto de solicitud como parámetro y devuelven un objeto de respuesta.

  • Objeto de solicitud: El objeto de solicitud contiene la información de la solicitud enviada por el cliente, como el método de solicitud, la URL, las cabeceras, los datos de formulario, etc.

  • Objeto de respuesta: El objeto de respuesta contiene la información de la respuesta enviada al cliente, como el código de estado, las cabeceras de respuesta, el cuerpo de la respuesta, etc.

  • Plantillas: Flask utiliza el motor de plantillas Jinja2 para renderizar plantillas HTML. Las plantillas te permiten incrustar código Python en HTML para generar páginas web dinámicamente.

  • Fábrica de aplicaciones: Una fábrica de aplicaciones es una función de Python que crea y devuelve una instancia de la aplicación Flask. Esto te permite configurar e inicializar tu aplicación, y también crear múltiples instancias de la aplicación.

  • Objeto de configuración: La aplicación Flask tiene un objeto de configuración que puedes utilizar para establecer diversas opciones de configuración, como la cadena de conexión a la base de datos, el modo de depuración, etc.

  • Blueprints: Los blueprints son una forma de organizar el código en Flask; te permiten agrupar funciones de vista, plantillas y archivos estáticos relacionados, y pueden reutilizarse en múltiples aplicaciones.

  • Archivos estáticos: Los archivos estáticos son archivos que no se ejecutan en el servidor, como CSS, JavaScript e imágenes. Flask ofrece un método sencillo para servir estos archivos.

  • Extensiones: Flask tiene muchas extensiones que pueden añadir funcionalidades adicionales, como integración de bases de datos, validación de formularios, autenticación de usuarios, etc.

  • Sesiones: Flask utiliza sesiones de cliente para almacenar información del usuario, lo que te permite recordar su estado mientras navega por tu aplicación.

  • Manejo de errores: Flask te permite definir funciones de manejo de errores; estas funciones se invocan cuando ocurre un error específico.

1. Enrutamiento (Routing)

El enrutamiento es la asignación de URL a funciones de Python. Flask te permite definir rutas, de modo que cuando un usuario accede a una URL específica, Flask llama a la función de vista correspondiente para manejar la solicitud.

Ejemplo

from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return 'Welcome to the Home Page!'

@app.route('/about')
def about():
    return 'This is the About Page.'
  • @app.route('/'): Mapear la URL raíz/ahomela función.
  • @app.route('/about'): Mapear/aboutla URL aaboutla función.

2. Funciones de vista (View Functions)

Las funciones de vista son funciones de Python que procesan solicitudes y devuelven respuestas. Normalmente reciben el objeto de solicitud como parámetro y devuelven un objeto de respuesta, o simplemente devuelven cadenas de texto, HTML, etc.

Ejemplo

from flask import request

@app.route('/greet/<name>')
def greet(name):
    return f'Hello, {name}!'

La función greet recibe el parámetro name de la URL y devuelve una respuesta en forma de cadena.

3. Objeto de solicitud (Request Object)

El objeto de solicitud contiene la información de la solicitud enviada por el cliente, incluyendo el método de solicitud, la URL, las cabeceras, los datos de formulario, etc. Flask proporciona el objeto request para acceder a esta información.

Ejemplo

from flask import request

@app.route('/submit', methods=['POST'])
def submit():
    username = request.form.get('username')
    return f'Hello, {username}!'

request.form.get('username'): Obtener el campo username de los datos del formulario en una solicitud POST.

4. Objeto de respuesta (Response Object)

El objeto de respuesta contiene la información de la respuesta enviada al cliente, incluyendo el código de estado, las cabeceras de respuesta y el cuerpo de la respuesta. Por defecto, Flask utiliza cadenas de texto o HTML directamente como cuerpo de la respuesta.

Ejemplo

from flask import make_response

@app.route('/custom_response')
def custom_response():
    response = make_response('This is a custom response!')
    response.headers['X-Custom-Header'] = 'Value'
    return response

make_response: Crear un objeto de respuesta personalizado y configurar la cabecera de respuesta X-Custom-Header.

5. Plantillas (Templates)

Flask utiliza el motor de plantillas Jinja2 para renderizar plantillas HTML. Las plantillas te permiten incrustar código Python en HTML para generar contenido web dinámicamente.

Ejemplo

from flask import render_template

@app.route('/hello/<name>')
def hello(name):
    return render_template('hello.html', name=name)

Archivo de plantilla (templates/hello.html):

Ejemplo

<!DOCTYPE html>
<html>
<head>
    <title>Hello</title>
</head>
<body>
    <h1>Hello, {{ name }}!</h1>
</body>
</html>

6. Fábrica de aplicaciones (Application Factory)

Una fábrica de aplicaciones es una función de Python que se utiliza para crear y configurar instancias de la aplicación Flask. Este método te permite crear múltiples instancias de la aplicación o inicializarla con diferentes configuraciones.

Ejemplo

from flask import Flask

def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config_name)

    from . import routes
    app.register_blueprint(routes.bp)

    return app

La función create_app crea una instancia de la aplicación Flask y carga la configuración desde el objeto de configuración.

7. Objetos de configuración (Configuration Objects)

El objeto de configuración se utiliza para establecer diversas opciones de configuración de la aplicación, como la cadena de conexión a la base de datos, el modo de depuración, etc. Puedes configurar la aplicación Flask asignando valores directamente o cargando un archivo de configuración.

Ejemplo

class Config:
    DEBUG = True
    SECRET_KEY = 'mysecretkey'
    SQLALCHEMY_DATABASE_URI = 'sqlite:///mydatabase.db'

app.config.from_object(Config): Cargar los elementos de configuración de la clase Config en la configuración de la aplicación.

8. Blueprints

Los blueprints son una forma de organizar el código en Flask. Te permiten agrupar funciones de vista, plantillas y archivos estáticos relacionados, y pueden reutilizarse en múltiples aplicaciones.

Ejemplo

from flask import Blueprint

bp = Blueprint('main', __name__)

@bp.route('/')
def home():
    return 'Home Page'

Registrar blueprint (app/__init__.py):

Ejemplo

from flask import Flask
from .routes import bp as main_bp

def create_app():
    app = Flask(__name__)
    app.register_blueprint(main_bp)
    return app

9. Archivos estáticos (Static Files)

Los archivos estáticos son archivos que no se ejecutan en el servidor, como CSS, JavaScript e imágenes. Flask ofrece un método sencillo para servir estos archivos.

Ejemplo de acceso a archivos estáticos:

<link rel="stylesheet" type="text/css" href="{{ url_for(.html'static', filename='style.css') }}">

Directorio de archivos estáticos:Coloca los archivos estáticos en la carpeta static, y Flask los servirá automáticamente.

10. Extensiones (Extensions)

Flask tiene muchas extensiones que pueden añadir funcionalidades adicionales, como integración de bases de datos, validación de formularios, autenticación de usuarios, etc. Estas extensiones ofrecen funciones más avanzadas e integración con terceros.

Ejemplo

from flask_sqlalchemy import SQLAlchemy

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db'
db = SQLAlchemy(app)

SQLAlchemy: Extensión para la integración de bases de datos.

11. Sesiones (Sessions)

Flask utiliza sesiones de cliente para almacenar información del usuario, con el fin de recordar su estado mientras navega por la aplicación. Los datos de la sesión se almacenan en una cookie en el cliente y se firman y cifran en el servidor.

Ejemplo

from flask import session

# Clave generada automáticamente
app.secret_key = 'your_secret_key_here'

@app.route('/set_session/<username>')
def set_session(username):
    session['username'] = username
    return f'Session set for {username}'

@app.route('/get_session')
def get_session():
    username = session.get('username')
    return f'Hello, {username}!' if username else 'No session data'

El objeto session se utiliza para almacenar y acceder a los datos de sesión.

Puedes usar el módulo secrets integrado de Python para generar una clave fuertemente aleatoria.

python3 -c 'import secrets; print(secrets.token_hex())'

12. Manejo de errores (Error Handling)

Flask te permite definir funciones de manejo de errores; estas funciones se llaman cuando ocurre un error específico. Puedes personalizar páginas de error o la lógica de manejo.

Ejemplo

@app.errorhandler(404)
def page_not_found(e):
    return 'Page not found', 404

@app.errorhandler(500)
def internal_server_error(e):
    return 'Internal server error', 500

@app.errorhandler(404): Definir una función de manejo para el error 404 y devolver una página de error personalizada.

Otras extensiones