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.