Última actualización: 15 de diciembre de 2023

6.4. Aplicación CRUD

Hacer un demo local de una aplicación Flask CRUD, 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:

Actualizar repositorios de paquetes disponibles para instalar, con el siguiente comando:

$ sudo apt update

Instalar dependencias mínimas necesarias, con el siguiente comando:

$ sudo apt install python3-dev python3-pip python3-virtualenv git sqlitebrowser

6.4.2. Entorno virtual Python

Crear entorno virtual Python en directorio $HOME con el siguiente comando:

$ virtualenv --python=/usr/bin/python3 venv

Activarlo entorno virtual Python creado con el siguiente comando:

$ source ~/venv/bin/activate

6.4.3. Instalar paquetes Python

Para instalar las dependencias para usar del framework Flask, con el siguiente comando:

$ pip3 install Flask==1.0.2 Flask-SQLAlchemy==2.4.0 SQLAlchemy==1.3.5

6.4.3.1. Estructura de proyecto

Crear estructura de proyecto Flask, con el siguiente comando:

$ mkdir -p ~/projects/flask-crud-app/templates && cd $_ && cd ../

Cree modulo Python llamado bookmanager.py dentro del directorio ~/projects/flask-crud-app, con el siguiente comando:

$ nano ~/projects/flask-crud-app/bookmanager.py

Agregue el siguiente contenido al archivo ~/projects/flask-crud-app/bookmanager.py.


from flask_sqlalchemy import SQLAlchemy

project_dir = os.path.dirname(os.path.abspath(__file__))
database_file = "sqlite:///{}".format(os.path.join(project_dir, "bookdatabase.db"))

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = database_file
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False

db = SQLAlchemy(app)

class Book(db.Model):
    title = db.Column(db.String(80), unique=True, nullable=False, primary_key=True)

    def __repr__(self):
        return "<Title: {}>".format(self.title)


@app.route("/", methods=["GET", "POST"])
def home():
    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)
    books = Book.query.all()
    return render_template("home.html", books=books)


@app.route("/update", methods=["POST"])
def update():
    try:
        newtitle = request.form.get("newtitle")
        oldtitle = request.form.get("oldtitle")
        book = Book.query.filter_by(title=oldtitle).first()
        book.title = newtitle
        db.session.commit()
    except Exception as e:
        print("Couldn't update book title")
        print(e)
    return redirect("/")


@app.route("/delete", methods=["POST"])
def delete():
    title = request.form.get("title")
    book = Book.query.filter_by(title=title).first()
    db.session.delete(book)
    db.session.commit()
    return redirect("/")


if __name__ == "__main__":
    db.create_all()
    app.run(host='0.0.0.0', port=8087, debug=True)

Cree plantilla HTML llamado home.html dentro del directorio ~/projects/flask-crud-app/templates, con el siguiente comando:

$ nano ~/projects/flask-crud-app/templates/home.html

Agregue el siguiente contenido al archivo ~/projects/flask-crud-app/templates/home.html.

<html>
  <body>
    <h1>Add book</h1>
    <form method="POST" action="/">
      <input type="text" name="title">
      <input type="submit" value="Add">
    </form>

    <h1>Books</h1>
    <table>
      {% for book in books %}
        <tr>
          <td>
            {{book.title}}
          </td>
          <td>
            <form method="POST" action="./update" style="display: inline">
              <input type="hidden" value="{{book.title}}" name="oldtitle">
              <input type="text" value="{{book.title}}" name="newtitle">
              <input type="submit" value="Update">
            </form>
          </td>
          <td>
            <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>

6.4.3.2. Crear base de datos

Crear base de datos SQLite, con los siguientes comando:

$ cd ~/projects/flask-crud-app/
$ python3
>>> from bookmanager import db
>>> db.create_all()
>>> exit()

De esta forma puede ver gráficamente la estructura de la base de datos SQLite, con el siguiente comando:

$ sqlitebrowser bookdatabase.db

Este mostrara el Database Browser para SQLite de la aplicación BookManager, como la siguiente figura:

BookManager - Database Browser para SQLite

Figura 6.4, Figura 6.4, BookManager - Database Browser para SQLite

De esta forma ya tiene creada la base de datos SQLite necesaria para la ejecución de la aplicación BookManager.

6.4.3.3. Ejecutar aplicación Flask

Ejecutar aplicación Web Flask, con el siguiente comando:

$ python3 bookmanager.py

Abrir en navegador >>> http://127.0.0.1:8087

BookManager - una Aplicación CRUD Flask

Figura 6.5, Figura 6.5, BookManager - una Aplicación CRUD Flask

Nota

El código ejemplo usado puede encontrarlo en: https://github.com/macagua/example.flask.crud-app


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. GMT-4 - Caracas, Venezuela.

La hora aquí es actualmente 7:35 PM GMT-4.

Mi objetivo es responder a todos los mensajes dentro de un día hábil.

Contrata mi increíble soporte profesional