Creating a modular web app with blueprints
A blueprint is a feature in Flask that helps make large applications modular. This keeps application dispatching simple by providing a central place to register all components in an application. A blueprint looks like an application object but is not an application. It also looks like a pluggable app or a smaller part of a bigger app, but it is not. A blueprint is a set of operations that can be registered on an application and represents how to construct or build an application. Another benefit is that it allows us to create reusable components between multiple applications.
Getting ready
In this recipe, we’ll take the application from the previous recipe, Composition of views and models, as a reference and modify it so that it works using blueprints.
How to do it...
The following is an example of a simple Hello World application using Blueprint
. It will work like it did in the previous recipe but will be much more modular and extensible.
First, we will start with the following flask_app/my_app/__init__.py
file:
from flask import Flask from my_app.hello.views import hello app = Flask(__name__) app.register_blueprint(hello)
Next, we will add some code to the views file, my_app/hello/views.py
, which should look as follows:
from flask import Blueprint from my_app.hello.models import MESSAGES hello = Blueprint('hello', __name__) @hello.route('/') @hello.route('/hello') def hello_world(): return MESSAGES['default'] @hello.route('/show/<key>') def get_message(key): return MESSAGES.get(key) or "%s not found!" % key @hello.route('/add/<key>/<message>') def add_or_update_message(key, message): MESSAGES[key] = message return "%s Added/Updated" % key
We have now defined a blueprint in the flask_app/my_app/hello/views.py
file. We no longer need the application object in this file, and our complete routing is defined on a blueprint named hello
. Instead of @app.route
, we use @hello.route
. The same blueprint is imported into flask_app/my_app/__init__.py
and registered on the application object.
We can create any number of blueprints in our application and complete most of the activities that we would usually do, such as providing different template paths or different static paths. We can even have different URL prefixes or subdomains for our blueprints.
How it works...
This application will work in just the same way as the last application. The only difference is in the way the code is organized.