The application factory pattern helps create Flask apps in a flexible way. It lets you make multiple app instances with different settings easily.
Application factory pattern in Flask
def create_app(config_name=None): app = Flask(__name__) if config_name: app.config.from_object(config_name) # Initialize extensions here # Register blueprints here return app
The function create_app returns a new Flask app instance each time it is called.
You can pass configuration or other setup info as arguments to customize the app.
def create_app(): app = Flask(__name__) app.config['DEBUG'] = True return app
def create_app(config_name): app = Flask(__name__) app.config.from_object(config_name) return app
def create_app(): app = Flask(__name__) from .views import main_blueprint app.register_blueprint(main_blueprint) return app
This example shows a complete Flask app using the application factory pattern. It creates the app inside create_app, sets debug mode, registers a blueprint with a route, and runs the app.
from flask import Flask, Blueprint main_blueprint = Blueprint('main', __name__) @main_blueprint.route('/') def home(): return 'Hello from the factory app!' def create_app(): app = Flask(__name__) app.config['DEBUG'] = True app.register_blueprint(main_blueprint) return app if __name__ == '__main__': app = create_app() app.run()
Use the factory pattern to avoid creating app instances at import time, which helps testing and scaling.
Extensions like Flask-Migrate or Flask-Login often require the app instance, so initialize them inside the factory or use their init_app method.
Remember to register all blueprints and extensions inside the factory function before returning the app.
The application factory pattern creates Flask apps inside a function for flexibility.
It helps manage different configurations and organize code better.
Use it to register blueprints and initialize extensions cleanly.
Practice
application factory pattern in Flask?Solution
Step 1: Understand the pattern's purpose
The application factory pattern creates the Flask app inside a function instead of globally. This allows creating multiple app instances with different settings.Step 2: Compare options to the pattern's goal
The other options contradict the flexibility and organization benefits of the pattern. Only "To create the Flask app inside a function for better flexibility and configuration" correctly describes the main purpose.Final Answer:
To create the Flask app inside a function for better flexibility and configuration -> Option AQuick Check:
Application factory = create app in function [OK]
- Thinking app is created globally, not inside a function
- Confusing blueprints with the factory pattern
- Assuming configuration is hardcoded, not flexible
Solution
Step 1: Check function definition and app creation
def create_app():\n app = Flask(__name__)\n return app correctly defines a function namedcreate_appthat creates a Flask instance and returns it.Step 2: Identify syntax errors or incorrect returns
app = Flask(__name__)\ndef create_app():\n return app creates app outside the function, which is not factory pattern. def create_app():\n return Flask returns the Flask class, not an instance. def create_app():\n app = Flask\n return app tries to assign Flask class without parentheses, causing error.Final Answer:
def create_app():\n app = Flask(__name__)\n return app -> Option CQuick Check:
Factory function creates and returns app instance [OK]
- Returning the Flask class instead of an instance
- Creating app outside the factory function
- Missing parentheses when creating Flask instance
print(app.config['DEBUG']) output?def create_app():
app = Flask(__name__)
app.config['DEBUG'] = True
return app
app = create_app()
print(app.config['DEBUG'])Solution
Step 1: Trace the factory function execution
The functioncreate_appcreates a Flask app and setsapp.config['DEBUG'] = Truebefore returning the app.Step 2: Check the printed config value
After callingcreate_app(), the returned app hasDEBUGset toTrue. So printing it outputsTrue.Final Answer:
True -> Option BQuick Check:
Config DEBUG set True, print shows True [OK]
- Assuming default DEBUG is False without setting
- Expecting KeyError if config key is missing (it's set here)
- Confusing app instance with factory function
def create_app():
app = Flask(__name__)
@app.route('/')
def home():
return 'Hello'
return app
app = create_app()
app.run()Solution
Step 1: Review the factory function structure
The function creates a Flask app, defines a route inside it, and returns the app instance.Step 2: Check usage of app.run()
Callingapp.run()outside the factory is normal to start the server. The code is valid and will run correctly.Final Answer:
No error; code runs correctly -> Option DQuick Check:
Defining routes inside factory and running app outside is valid [OK]
- Thinking app.run() must be inside factory
- Assuming route decorators can't be inside factory
- Confusing Flask constructor syntax
Solution
Step 1: Understand blueprint registration
Blueprints are registered on the app usingapp.register_blueprint(). Two options do this correctly, while one incorrectly callsmain_bp.register_blueprint(app).Step 2: Check extension initialization
For extensions like SQLAlchemy, the recommended pattern is to instantiate the extension without the app (db = SQLAlchemy()) and then calldb.init_app(app). The option that doesdb = SQLAlchemy(); db.init_app(app)follows this correctly. The other factory option with correct blueprint registration usesdb = SQLAlchemy(app), which binds it directly to the app and is less flexible.Final Answer:
def create_app(): app = Flask(__name__) from .views import main_bp app.register_blueprint(main_bp) from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() db.init_app(app) return app -> Option AQuick Check:
Blueprint registered on app; extension initialized with init_app [OK]
- Registering blueprint on blueprint instead of app
- Creating extension with app inside factory instead of init_app
- Not importing blueprint inside factory function
Ready to prove it?
Pass the test and this pattern moves unknown
