Toggle navigation

Step 4: Database Connections

Let’s continue building our code in the flaskr.py file. (Scroll to the end of the page for more about project layout.)

You currently have a function for establishing a database connection with [UNKNOWN NODE title_reference], but by itself, it is not particularly useful. Creating and closing database connections all the time is very inefficient, so you will need to keep it around for longer. Because database connections encapsulate a transaction, you will need to make sure that only one request at a time uses the connection. An elegant way to do this is by utilizing the application context.

Flask provides two contexts: the application context and the request context. For the time being, all you have to know is that there are special variables that use these. For instance, the request variable is the request object associated with the current request, whereas g is a general purpose variable associated with the current application context. The tutorial will cover some more details of this later on.

For the time being, all you have to know is that you can store information safely on the g object.

So when do you put it on there? To do that you can make a helper function. The first time the function is called, it will create a database connection for the current context, and successive calls will return the already established connection:

def get_db():
    """Opens a new database connection if there is none yet for the
    current application context.
    """
    if not hasattr(g, 'sqlite_db'):
        g.sqlite_db = connect_db()
    return g.sqlite_db

Now you know how to connect, but how can you properly disconnect? For that, Flask provides us with the teardown_appcontext() decorator. It’s executed every time the application context tears down:

@app.teardown_appcontext
def close_db(error):
    """Closes the database again at the end of the request."""
    if hasattr(g, 'sqlite_db'):
        g.sqlite_db.close()

Functions marked with teardown_appcontext() are called every time the app context tears down. What does this mean? Essentially, the app context is created before the request comes in and is destroyed (torn down) whenever the request finishes. A teardown can happen because of two reasons: either everything went well (the error parameter will be None) or an exception happened, in which case the error is passed to the teardown function.

Curious about what these contexts mean? Have a look at the The Application Context documentation to learn more.

Continue to Step 5: Creating The Database.