If you are already using packages and blueprints for your application (Modular Applications with Blueprints) there are a couple of really nice ways to further improve the experience. A common pattern is creating the application object when the blueprint is imported. But if you move the creation of this object, into a function, you can then create multiple instances of this and later.
So why would you want to do this?
So how would you then actually implement that?
The idea is to set up the application in a function. Like this:
def create_app(config_filename):
app = Flask(__name__)
app.config.from_pyfile(config_filename)
from yourapplication.model import db
db.init_app(app)
from yourapplication.views.admin import admin
from yourapplication.views.frontend import frontend
app.register_blueprint(admin)
app.register_blueprint(frontend)
return app
The downside is that you cannot use the application object in the blueprints at import time. You can however use it from within a request. How do you get access to the application with the config? Use current_app:
from flask import current_app, Blueprint, render_template
admin = Blueprint('admin', __name__, url_prefix='/admin')
@admin.route('/')
def index():
return render_template(current_app.config['INDEX_TEMPLATE'])
Here we look up the name of a template in the config.
Extension objects are not initially bound to an application. Using db.init_app, the app gets configured for the extension. No application-specific state is stored on the extension object, so one extension object can be used for multiple apps. For more information about the design of extensions refer to Flask Extension Development.
Your model.py might look like this when using Flask-SQLAlchemy:
from flask.ext.sqlalchemy import SQLAlchemy
# no app object passed! Instead we use use db.init_app in the factory.
db = SQLAlchemy()
# create some models
So to use such an application you then have to create the application first. Here an example run.py file that runs such an application:
from yourapplication import create_app
app = create_app('/path/to/config.cfg')
app.run()
The factory function from above is not very clever so far, you can improve it. The following changes are straightforward and possible: