Desarrollo de una aplicación web con Python, Flask y MySQL

Para configurar un proyecto web con Flask y MySQL, se organiza el directorio del proeycto con los siguientes elementos clave: un archivo principal para iniciar la aplicación, un módulo para gestionar rutas y lógica, y una conexión a la base de datos.

El archivo principal, inicio.py, se encarga de ejecutar la aplicación Flask:

# Codificación UTF-8
from modulo_aplicacion import app

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

El módulo modulo_aplicacion contiene la configuración inicial de Flask y la conexión a la base de datos. En su archivo __init__.py:

# Codificación UTF-8
from flask import Flask
from modulo_aplicacion.conexion_bd import ConexionBD

app = Flask(__name__, plantilla_carpeta='../plantillas')

conexion = ConexionBD()

from modulo_aplicacion import rutas

Se establece plantilla_carpeta para indicar la ubicación de las plantillas HTML, ya que el archivo __init__.py no está en el mismo directorio que inicio.py.

La conexión a la base de datos se implementa en conexion_bd.py, una clase que maneja las operaciones con MySQL usando pymysql y SQLAlchemy:

# Codificación UTF-8
import pymysql
import pandas as pd
from sqlalchemy import create_engine
from urllib import parse
import time

HOST_BD = "127.0.0.1"
USUARIO_BD = "root"
CONTRASENA_BD = "root"

class ConexionBD:
    def __init__(self):
        self.conexion = pymysql.connect(host=HOST_BD, port=3306, user=USUARIO_BD, passwd=CONTRASENA_BD, db="mi_base_datos", autocommit=True, connect_timeout=300, charset="utf8")
        self.cursor = self.conexion.cursor()
        url_conexion = "mysql+pymysql://{}:{}@{}:{}/{}".format(USUARIO_BD, parse.quote_plus(CONTRASENA_BD), HOST_BD, '3306', 'mi_base_datos')
        self.motor = create_engine(url_conexion)
        self.estado = True

    def verificar_conexion(self):
        intentos = 0
        while intentos < 3:
            try:
                self.conexion.ping()
                return True
            except pymysql.OperationalError:
                intentos += 1
                time.sleep(2)
        return False

    def ejecutar_consulta(self, consulta_sql):
        if self.verificar_conexion():
            self.cursor.execute(consulta_sql)
            self.conexion.commit()

    def obtener_datos_df(self, consulta_sql):
        return pd.read_sql_query(consulta_sql, self.motor)

    def obtener_todos(self):
        return self.cursor.fetchall()

    def obtener_uno(self):
        return self.cursor.fetchone()

Esta clase proporciona métodos para ejecutar consultas SQL y recuperar datos en formato DataFrame de pandas.

Las rutas se definen en rutas.py, donde se integra la lógica de negocio:

# Codificación UTF-8
from flask import render_template
from modulo_aplicacion import app
from servicio import obtener_lista_datos

@app.route('/consulta')
def mostrar_datos():
    datos = obtener_lista_datos()
    return render_template('resultado.html', tabla=datos)

La plantilla HTML resultado.html muestra los datos de manera tabular:

<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Datos consultados</title>
</head>
<body>
    <h3>Resultados de la consulta</h3>
    <table border="1">
        <tr>
            {% for encabezado in tabla.columns %}
                <th>{{ encabezado }}</th>
            {% endfor %}
        </tr>
        {% for fila in range(tabla.shape[0]) %}
            <tr>
                {% for columna in range(tabla.shape[1]) %}
                    <td>{{ tabla.iat[fila, columna] }}</td>
                {% endfor %}
            </tr>
        {% endfor %}
    </table>
</body>
</html>

Para ejecutar este proyecto, se deben instalar dependencias como Flask, pymysql, SQLAlchemy y pandas mediante herramientas de gestión de paquetes. La estructura descrita permite una aplicación web funcional conectada a una base de datos MySQL.

Etiquetas: Flask MySQL PyMySQL SQLAlchemy Python web

Publicado el 7-29 05:19