6.4. Aplicación CRUD¶
Hacer un demo local de una aplicación CRUD en Flask , es decir, una aplicación con las funciones básicas en bases de datos como «Crear, Leer, Actualizar y Borrar».
6.4.1. Requisitos previos¶
Para trabajar una aplicación Flask con bases de datos relacionales requiere
instalar las siguientes librerías:
Motor de base de datos SQLite.
Para trabajar una aplicación Flask con bases de datos relacionales
requiere instalar las siguientes librerías:
6.4.2. Estructura de proyecto¶
Crear estructura de proyecto Flask, con el siguiente comando:
mkdir -p ~/proyectos/flask/crud-app/templates && cd $_ && cd ../
Cree módulo Python llamado bookmanager.py dentro del
directorio ~/proyectos/flask/crud-app, con el siguiente comando:
nano ~/proyectos/flask/crud-app/bookmanager.py
Agregue el siguiente contenido al archivo ~/proyectos/flask/crud-app/bookmanager.py.
import os
from flask import Flask, render_template, request, redirect
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
PROJECT_DIR = os.path.dirname(os.path.abspath(__file__))
DATABASE_FILE = "sqlite:///{}".format(
os.path.join(
PROJECT_DIR,
"book_database.sqlite3"
)
)
app = Flask(__name__, static_folder='static')
app.config["SQLALCHEMY_DATABASE_URI"] = DATABASE_FILE
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
class Base(DeclarativeBase):
"""DeclarativeBase is a class that is used to create
a new base class for declarative class definitions.
Args:
DeclarativeBase (class): A class that is used to create
"""
pass
# SQLAlchemy is an ORM (Object Relational Mapper) that allows
# you to interact with databases using Python objects.
db = SQLAlchemy(app, model_class=Base)
class Book(db.Model):
"""Book model
Args:
db (class): An instance of SQLAlchemy
Returns:
class: A class that represents a book model
"""
id: Mapped[int] = mapped_column(
db.Integer,
primary_key=True
)
title: Mapped[str] = mapped_column(
db.String(80),
unique=True,
nullable=False
)
def __repr__(self):
return "<Title: {}>".format(self.title)
@app.route("/", methods=["GET", "POST"])
def home():
"""Home page route"""
books = None
if request.form:
try:
book = Book(title=request.form.get("title"))
db.session.add(book)
db.session.commit()
except Exception as e:
print("Failed to add book")
print(e)
# Get all books
books = Book.query.all()
return render_template("home.html", books=books)
@app.route("/update", methods=["POST"])
def update():
"""Update book title route"""
try:
new_title = request.form.get("new_title")
old_title = request.form.get("old_title")
book = Book.query.filter_by(title=old_title).first()
book.title = new_title
db.session.commit()
except Exception as e:
print("Couldn't update book title")
print(e)
return redirect("/")
@app.route("/delete", methods=["POST"])
def delete():
"""Delete book route"""
title = request.form.get("title")
book = Book.query.filter_by(title=title).first()
db.session.delete(book)
db.session.commit()
return redirect("/")
with app.app_context():
# Create tables
db.create_all()
# Run the app
app.run(host='0.0.0.0', port=5000, debug=True)
Cree plantilla HTML llamado home.html dentro del directorio
~/proyectos/flask/crud-app/templates, con el siguiente comando:
nano ~/proyectos/flask/crud-app/templates/home.html
Agregue el siguiente contenido al archivo ~/proyectos/flask/crud-app/templates/home.html.
<!DOCTYPE html>
<html>
<head>
<title>Books Manager</title>
<link rel="icon" href="{{ url_for('static', filename='images/flask-icon.png') }}"/>
</head>
<body>
<h1>Add new book</h1>
<!-- Add form -->
<form method="POST" action="/">
<input type="text" name="title">
<input type="submit" value="Add">
</form>
<h1>Books list</h1>
<table>
<!-- Books form -->
{% for book in books %}
<tr>
<td>
{{book.title}}
</td>
<td>
<!-- Update form -->
<form method="POST" action="./update" style="display: inline">
<input type="hidden" value="{{book.title}}" name="old_title">
<input type="text" value="{{book.title}}" name="new_title">
<input type="submit" value="Update">
</form>
</td>
<td>
<!-- Delete form -->
<form method="POST" action="./delete" style="display: inline">
<input type="hidden" value="{{book.title}}" name="title">
<input type="submit" value="Delete">
</form>
</td>
</tr>
{% endfor %}
</table>
</body>
</html>
Para ejecutar el código del proyecto llamado crud-app abra una consola de comando, cree la
siguiente estructura de directorio y acceda al mismo donde se encuentra el programa:
proyectos/
└── flask/
└── crud-app/
├── bookmanager.py
└── templates/
└── home.html
Si tiene la estructura de archivo previa, entonces puede continuar los procesos de instalación, configuración y ejecución del código fuente.
6.4.3. Instalar paquetes Python¶
Para instalar el framework Flask usando la herramienta pip,
ejecute el siguiente comando:
pip3 install Flask==3.1.0 Flask-SQLAlchemy==3.1.1 SQLAlchemy==2.0.38
Si ejecuto el comando anterior, instalo las librerías necesarias para ejecutar. De esta forma puede continuar.
6.4.4. Ejecutar aplicación Flask¶
Para ejecutar la aplicación Web Flask, debe ejecutar el siguiente comando:
python3 bookmanager.py
De esta forma, una vez ejecutado el comando, se puede abrir desde con su navegador Web favorito (Mozilla Firefox, Google Chrome, etc) la siguiente dirección http://127.0.0.1:8087
Figura 6.4,
BookManager - una Aplicación CRUD Flask.¶
La ejecución de la aplicación Web Flask crea la base de datos SQLite
book_database.sqlite3 en el directorio ~/proyectos/flask/crud-app/.
Puede ver examinar la estructura de la base de datos SQLite, de las siguientes formas:
Por ejemplo, el DB Browser for SQLite mostrará gráficamente la estructura de la aplicación BookManager,
como la siguiente figura:
Figura 6.5,
BookManager - DB Browser para SQLite¶
Truco
La base de datos SQLite se crea automáticamente al ejecutar la aplicación BookManager
necesaria para el funcionamiento de la aplicación.
De esta forma puede interactuar con un ejemplo operaciones dentro una base de datos SQLite.
Importante
Usted puede descargar el código usado en esta sección haciendo clic en los siguientes enlaces:
Nota
El código ejemplo usado puede encontrarlo en: https://github.com/macagua/example.flask.crud-app
Truco
Usando el articulo «Building a CRUD application with Flask and SQLAlchemy».
Ver también
Consulte la sección de lecturas suplementarias del entrenamiento para ampliar su conocimiento en esta temática.
¿Cómo puedo ayudar?
¡Mi soporte está aquí para ayudar!
Mi horario de oficina es de lunes a sábado, de 9 AM a 5 PM. UTM - Madrid, España.
La hora aquí es actualmente 7:35 PM UTM.
Mi objetivo es responder a todos los mensajes dentro de un día hábil.