Flask Integration

How to use Bootstrap 5 with Flask - free starter

This guide will provide you with a free template for a Flask application, with MySQL database and Bootstrap 5 front-end.


Prerequisites

Before starting the project make sure to install the following utilities:


Creating a new Flask application

Let's create a fresh Flask application so that we can go through all the steps together. For this tutorial we'll be using MySQL database.

Note: Depending on your OS you may need to use different commands. Copy the commands appropriate for your operating system.

Step 1

First, we need to create a project directory. We'll use a virtual environment to manage the dependencies for your project.

        
            
      mkdir myproject
      cd myproject
      python3 -m venv venv
    
        
    
        
            
      mkdir myproject
      cd myproject
      py -3 -m venv venv
    
        
    

Step 2

Before you work on your project, activate the corresponding environment. In case you are working on Windows and the command is not working, try this: source ./venv/Scripts/activate

        
            
      . venv/bin/activate
    
        
    
        
            
      venv\Scripts\activate
    
        
    

You should see venv folder added to your project directory, and in your terminal, the (venv) badge will be added before the path.

Step 3

Use the following command to install Flask.

        
            
    pip install Flask
    
        
    

Step 4

Open your project directory in the code editor. Create folder toDoApp, there create __init__.py file. Paste the content of the snippet below as its content.

        
            
    from flask import Flask, render_template

    app = Flask(__name__)
    
    @app.route("/")
    def index():
        return render_template("index.html")
    
    if __name__ == "__main__":
        app.run()
    
        
    

Step 5

Install Flask SQLAlchemy library for handling MySQL database.

        
            
        pip install flask_sqlalchemy
      
        
    

Step 6

Creating a MySQL database.

In order to create a new database you need to run the following command.

Note: If you don't have MDB CLI installed yet, you can do it with NPM: npm install -g mdb-cli. Now log in with your MDB account, type: mdb login. If you don't have account yet you can create one using mdb register command.

        
            
          mdb database init -db mysql8
        
        
    
  • Create a new user
  • Provide username, password, database name and description.

CLI will display your username, password, database name and connections string. You will need this data in the next step. Now you can go to phpMyAdmin where you will be able to handle the administration of the MySQL database.

Note: the password must contain at least one uppercase letter, one lowercase letter, one number, one special symbol and have minimum length of 8.

Step 7

Edit __init__.py file by adding MySQL database configuration. Change the value between brackets for the database URL you got after creating a new MySQL Database from our starter.

        
            
      from flask_sqlalchemy import SQLAlchemy

      ...
      app.config['SQLALCHEMY_DATABASE_URI'] = '[Your database URL]'
      app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
      db = SQLAlchemy(app)
      
      class Todo(db.Model):
          id = db.Column(db.Integer, primary_key=True)
          name = db.Column(db.String(100))
          desc = db.Column(db.String(200))

      if __name__ == "__main__":
          db.create_all()
          app.run()

      
        
    

Step 8

Inside the toDoApp directory create folder templates, and there create an index.html file. There paste example content from the snippet below to see if the formatting is correct after you link CSS files.

        
            
    <html lang="en">
    <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
      <title>Material Design for Bootstrap</title>
      <!-- Font Awesome -->
      <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet" />
      <!-- Google Fonts -->
      <link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" rel="stylesheet" />
    </head>
    <body>
      <div class="container py-4 px-3 mx-auto">
        <h1>Hello, MDB and Flask!</h1>
        <button class="btn btn-primary">Primary button</button>
      </div>
    </body>
    </html>
    
        
    

Step 9

Run your app with a command from the snippet below. The first launch of the application will create tables associated with your model in your database.

        
            
      flask --app toDoApp --debug run
    
        
    

Now head over to http://127.0.0.1:5000/ and you should see your example page in the browser.


Install MDB

In this section, we will add MDB styles and JavaScript files to the example page.

Step 1

From base the project directory type the following command in the terminal. It will change the directory to toDoApp/static and initialize MDB CLI. From the list of starters select Standard.

Note: If you don't have MDB CLI installed yet, you can do it with NPM: npm install -g mdb-cli. Now log in with your MDB account, type: mdb login. If you don't have account yet you can create one using mdb register command.

        
            
        cd toDoApp
        mkdir static
        cd static
        mdb frontend init mdb5-free-standard
      
        
    

Step 2

In the head of the index.html file import static CSS files.

        
            
      <link rel="stylesheet" href="{{ url_for('static', filename='mdb5-free-standard/css/mdb.min.css' )}}">
      
        
    

Step 3

At the end of the body tag in the index.html file import static JS files.

        
            
        <script type="text/javascript" src="{{ url_for('static', filename='mdb5-free-standard/js/mdb.umd.min.js' )}}"></script>
      
        
    
Now you're done

With MDB's CSS and JS fully loaded, after restarting the server your example page should work and you should see MDB styles applied to its content.


To Do App with MDB

In this section, we will present the capabilities of Ruby on Rails used with the MDB package by creating an example To Do App.

Step 1

Import request, redirect and url_for packages from Flask. Change a route assigned to the index and add routes to add, delete, and update.

        
            
        from flask import Flask, render_template, request, redirect, url_for

        ...
        @app.route("/")
        def index():
            todo_list = Todo.query.all()
            return render_template("index.html", tasks=todo_list)
        
        @app.route("/add", methods=["POST"])
        def add():
            name = request.form.get("name")
            desc = request.form.get("desc")
            new_todo = Todo(name=name, desc=desc)
            db.session.add(new_todo)
            db.session.commit()
            return redirect(url_for("index"))
        
        @app.route("/update/<int:todo_id>", methods=["POST"])
        def update(todo_id):
            todo = Todo.query.filter_by(id=todo_id).first()
            todo.name = request.form.get("name")
            todo.desc = request.form.get("desc")
            db.session.commit()
            return redirect(url_for("index"))
        
        @app.route("/delete/<int:todo_id>")
        def delete(todo_id):
            todo = Todo.query.filter_by(id=todo_id).first()
            db.session.delete(todo)
            db.session.commit()
            return redirect(url_for("index"))

        
        
    

Step 2

Change the content of the body tag in the index.html file to the content of the snippet below but don't remove the script tag that imports JavaScript files.

        
            
        <div class="container mt-5">
          <!-- Button trigger modal -->
          <div class="row pt-5">
              <div class="col text-center">
                  <button class="btn btn-primary" data-mdb-modal-init data-mdb-target="#TaskModal" id="addTaskButton" data-mdb-ripple-init>Add task</button>
              </div>
          </div>
      
          <!-- Modal Add -->
          <div class="modal top fade" id="TaskModal" tabindex="-1" aria-labelledby="TaskModalLabel" aria-hidden="true">
              <div class="modal-dialog">
                  <div class="modal-content">
                      <div class="modal-header">
                          <h5 class="modal-title" id="taskModalLabel">Add task</h5>
                          <button type="button" class="btn-close" data-mdb-dismiss="modal" aria-label="Close"></button>
                      </div>
                      <form action="/add" method="POST" id="taskForm">
                          <div class="modal-body">
                                  <div class="form-outline mb-4" data-mdb-input-init>
                                      <input name='name' type="text" id="editNameInput" class="form-control"/>
                                      <label class="form-label" for="editNameInput">Name</label>
                                  </div>
                                  <div class="form-outline mb-4" data-mdb-input-init>
                                      <input name="desc" type="text" id="editDescInput" class="form-control">
                                      <label class="form-label" for="editDescInput">Description</label>
                                  </div>
                                  <input name="id" type="hidden" id="taskId" >
                          </div>
                          <div class="modal-footer">
                              <button type="button" class="btn btn-secondary" data-mdb-dismiss="modal" data-mdb-ripple-init>
                                  Close
                              </button>
                              <button type="submit" class="btn btn-primary" id="confirmButton" data-mdb-ripple-init>Confirm</button>
                          </div>
                      </form>
                  </div>
              </div>
          </div>
      
          <!-- List of tasks -->
          <div class="row mt-3 p-5">
              <div class="col d-flex justify-content-center align-items-center">
                  <ul class="list-group list-group-light" style="min-width: 22rem;">
  
                      {% for task in tasks %}
                      <li class="list-group-item d-flex justify-content-between align-items-center gap-5" id="{{ task.id }}">
                          <div>
                              <div class="fw-bold name">{{ task.name }}</div>
                              <div class="fw-bold desc">{{ task.desc }}</div>
                          </div>
                          <div class="d-flex align-items-center">
                              <a class="btn btn-primary btn-floating me-2" data-mdb-modal-init data-mdb-target="#TaskModal" onclick="setModalValues('{{ task.id }}')" data-mdb-ripple-init>
                                  <span class="fas fa-pen text-white"></span>
                              </a>
                              <form action='delete/{{ task.id }}' class="my-0">
                                  <button type="submit" class="btn btn-danger btn-floating" data-mdb-ripple-init>
                                      <span class="fas fa-trash text-white" title="delete"></span>
                                  </button>
                              </form>
                          </div>
                      </li>
                      {% endfor %}
                  </ul>
              </div>
          </div>
      </div>
        
        
    

Step 3

At the end of the body tag in the index.html add code from the snippet below.

        
            
          <script>
            const editNameInput = document.getElementById('editNameInput');
            const editDescInput = document.getElementById('editDescInput');
            const taskId = document.getElementById('taskId');
            const taskForm = document.getElementById('taskForm');
            const taskModalLabel = document.getElementById('taskModalLabel');
          
            function setModalValues(id) {
                const task = document.getElementById(id)
                editNameInput.value = task.querySelector('.name').innerText;
                editDescInput.value = task.querySelector('.desc').innerText;
                taskForm.action = `/update/${id}`;
                taskModalLabel.innerText = 'Edit task';
            }
          
            const addTaskButton = document.querySelector('#addTaskButton');
            addTaskButton.addEventListener('click', () => {
                taskForm.action = `/add`;
                taskModalLabel.innerText = 'Add task';
            })
          </script>
        
        
    

To access your application visit http://localhost:3000. There you should see a simple To Do app connected to MySQL database.


Optimization

If you want to further optimize your application please visit:


Backend features

Flask:

This example was created with the use of Flask. Our app is connected to MySQL database and is ready to receive get, post, put and delete requests.

MDB CLI:

The database in this example was created using MDB CLI with Graphical User Interface available under phpmyadmin.mdbgo.com


Frontend features

MDB UI KIT:

We have successfully added MDB UI Kit to the created app, with which we can build basic views very quickly.

Views and Layouts:

We have successfully integrated the backend with the MDB package and can send basic requests to the backend Flask application.