Python Flask web application sample using MongoDB

  • Let us see how to set up a python flask web application that uses MongoDB back-end. In this topic, we will learn how to set up flask framework for the first time in your machine, how to run the flask applications, basic set up for your first HTML page and database actions like create a record, fetch data, update a record and delete (CRUD) from your flask application.

    Different libraries are available in Python to connect to MongoDB. In this sample, PyMongo is used.

  • Install Python and setup Virtual Environment

    Download and install the latest version of python from Python Website.

    Setting up virtual environment is not a must, but its is good to keep all your projects within a virtual environment. Here, we will proceed with a virtual environment.

    For that, go to the command prompt and cd to the folder where you are going to keep your project.
    Run command python -m venv CarSales to create a project folder CarSales and a virtual environment for it.
    Activate the VE using command:

    For Windows:
    CarSales\Scripts\activate.bat
    For Linux, macOS:
    source CarSales /bin/activate

    After VE activation, from cmd type cd CarSales to navigate to the project folder.

  • Install Flask

    To install flask, run command pip install flask or pip3.9 install flask
    If not working use commands:

    For Windows:
    py -3.9 -m pip install flask
    For Linux, macOS:
    python3.9 -m pip install flask

    Run pip freeze or pip3.9 freeze to check if flask installed successfully. Should give an output like this.

    click==8.1.3
    colorama==0.4.4
    Flask==2.1.2
    itsdangerous==2.1.2
    Jinja2==3.1.2
    MarkupSafe==2.1.1
    Werkzeug==2.1.2
    
  • Install PyMongo

    For MongoDB connection we are going to use the PyMongo library. Install this using the command: pip install pymongo or py -3.9 -m pip install pymongo or python3.9 -m pip install pymongo

  • Initial steps for Flask Web Apps

    Follow these basic steps to set up your first Flask web application.
    Create a file named carsales.py (you can provide any name), inside CarSales folder and copy below code to it. carsales.py is going to contain your start-up code which is required to run your webapp. From command prompt navigate to CarSales folder and execute command py -3.9 -m carsales or python3.9 -m carsales or py carsales.py or python carsales.py depending on OS and Python version.

    from flask import Flask
    
    carsales = Flask(__name__)
    
    if(__name__ == "__main__"):
        carsales.run()
    

    This code imports Flask module and creates an object carsales of Flask class. Last 2 lines serves as the entry point of the app and starts the server. In cmd, we will see the below message.

        * Serving Flask app 'carsales' (lazy loading)
        * Environment: production
        Use a production WSGI server instead.
        * Debug mode: off
        * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
    

    Copy the url http://127.0.0.1:5000/ to your browser and run. We will get the Not Found message as below.

    Flask and SQL Server - Not found

    This means that the Flask has handled the server set up and our application is ready. We will now have to set up our html pages and routing to handle page navigations.

  • Setting up First page

    We are going to keep a list page as the first page of the application.
    In Flask, all our HTML should be placed inside a folder named templates and static files like javascript or stylesheet should be placed inside static folder.So, create a folder structure as below within your application folder and add html file carslist.html inside templates folder.

    Flask and MongoDB - First Page

    Add below code to carslist.html. To handle routing for this page, modify carsales.py as below. This code imports render_template module and sets up the default route.

    In command prompt. click Ctrl + C to stop the application and run command py -3.9 -m carsales or python3.9 -m carsales or py carsales or python carsales (Varies depending on OS and the python version used). This process is to be done each time we make any changes and want to reload the page. Some times, after stopping flask application from command prompt, just reloading the html will not give you the desired output. If any such issues are faced, close the web page and reopen.

  • Database Setup

    We will use the PyMongo adapter to create database and a table and insert data to it.
    Create a file named mongodbData.py in the same code folder and paste the below code in it.
    Run this file using command py mongodbData.py or python mongodbData.py or py -3.9 -m mongodbData or python3.9 -m mongodbData.py

    This set of code connects to the local MongoDB client and then creates a database and a table in it. You should have MongoDB installed locally in your machine or use a valid server url in the below code.
    Then we are inserting five records to the table.

    Copied
    import pymongo
    
    carsalesClient = pymongo.MongoClient("mongodb://localhost:27017/")
    carsalesDB = carsalesClient["CarSales"]
    tblCars = carsalesDB["TblCars"]
    
    carslist = [
      { "ID": 1, "Name": "Toyota Camry", "Year": 2018, "Price": 2000 },
      { "ID": 2, "Name": "Honda Civic", "Year": 2019, "Price": 2200 },
      { "ID": 3, "Name": "Chevrolet Silverado", "Year": 2017, "Price": 1800 },
      { "ID": 4, "Name": "Ford F-150", "Year": 2020, "Price": 2500 },
      { "ID": 5, "Name": "Nissan Altima", "Year": 2021, "Price": 3000 }
    ]
    
    tbl = tblCars.insert_many(carslist)
    print(tbl.inserted_ids)
    
  • Fetch data from MongoDB and list

    carslist.html is going to hold the list of cars available for sale. To list the items, add below code in body of html and modify carsales.py main method as below. Also import pymongo. In python file, we are reading data from MongoDB database CarSales using pymongo built-in functions as shown below and pass it to html as a parameter. In html, we are looping through the items and list it as table rows.

    For styling we will use Bootstrap 5. Add below 2 lines inside head of html.

    
        <link rel="stylesheet" crossorigin="anonymous"
    	href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" >
        
    	<script crossorigin="anonymous"
    	src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" >
    	</script>
    
    

    On rerun, we will get below output window.

    Flask and SQL Server - List Items
  • Insert new item to MongoDB

    Add a new button in the carslist.html above the table.

        <a class="btn btn-primary" href="addcar">Add New Car</a>
    

    Add new html file, addcar.html and place below code. Add below code in caresales.py as the second route below main method.

    Now we have to import request and redirect. For that, change first line of caresales.py as below.

    from flask import Flask, render_template, request, redirect
    

    In the python code, we are defining a new route for addcar. We are using the same method for GET and POST. GET is just rendering addcar.html. In POST, we are reading data from form controls and save data to table and then redirect to list page.

    In HTML page, we are defining a form with 4 text boxes. Each has a name provided. This name is used in the python file while reading data from controls.
    On rerun, we can navigate to Create page as below and add new Car.

    Flask and SQL Server - Add an Item
  • Update items - MongoDB

    For update and delete add 2 links in the carslist.html page as below.

    Copied
    <table class="table">
        <thead>
            <tr>
            <th scope="col">Id</th>
            <th scope="col">Name</th>
            <th scope="col">Year</th>
            <th scope="col">Price</th>
            <th scope="col">Edit</th>
            <th scope="col">Delete</th>
            </tr>
        </thead>
        <tbody>
            {% for car in cars %}
                <tr>
                    <td>{{ car.id }}</th>
                    <td>{{ car.name }}</td>
                    <td>{{ car.year }}</td>
                    <td>{{ car.price }}</td>
                    <td><a href='updatecar/{{ car.id }}'>Edit</a></td>
                    <td><a href='deletecar/{{ car.id }}'>Delete</a></td>
                </tr>
            {% endfor %}
        </tbody>
    </table>
    

    First, in addcar.html, in order to populate the values, use the value attribute and bind the car object values as in html provided below.

    Then, in carsales.py, add new updatecar route. Use the GET to fetch the details of the selected item and bind to the html. In POST, we are calling the update_one method to update records based on the seleted ID.

    Note: Disable the ID textbox to not make changes to ID. Here we are not doing it and if ID is changed no update will happen.

    After the above changes, update will work, but create will throw an error. To fix this, change the render_template line of addcar as below.

    return render_template("addcar.html", car = {})
    

    We are binding an empty car object to make it working.

  • Delete an Item from MongoDB

    For delete, add a new route deletecar and call delete_one method as below.

    Copied
    @carsales.route('/deletecar/<int:id>')
    def deletecar(id):
        carsalesDB = connectDB()
        tblCars = carsalesDB["TblCars"]
        tblCars.delete_one({ "ID": id })
        return redirect('/')
    
  • Flask CRUD with MongoDB database - Complete code

    Complete code is placed below.

Absolute Code Works - Python Topics