Skip to main content

Getting Started with the Flask CLI

The Flask command line interface (CLI) is powered by the FlaskGroup class, a specialized Click group that provides built-in commands for running, debugging, and inspecting your application. This tutorial guides you through using these core commands and creating your own custom management script.

Prerequisites​

To follow this tutorial, you need the flask package installed in your environment. You should also have a basic understanding of Flask application structures.

Step 1: Create a Sample Application​

First, create a file named hello.py with a simple Flask application. This will serve as the target for our CLI commands.

from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
return "Hello, World!"

@app.route("/api/data")
def get_data():
return {"data": "sample"}

This application defines two routes that we will later inspect using the CLI.

Step 2: Run the Development Server​

The most common CLI command is run, which starts the Werkzeug development server. Use the --app option to point Flask to your application file.

flask --app hello run

When you run this, Flask uses FlaskGroup to locate your app and run_command to start the server. You will see output indicating the server is running on http://127.0.0.1:5000.

To enable interactive debugging and automatic reloading when code changes, add the --debug flag:

flask --app hello --debug run

The --debug flag is handled by FlaskGroup during initialization, setting the application's debug state before the server starts.

Step 3: Inspect Application Routes​

As your application grows, it becomes useful to see all registered URL rules. The routes command, implemented via routes_command, provides a tabular view of your app's routing table.

flask --app hello routes

By default, this sorts by endpoint. You can change the sorting logic using the --sort option:

flask --app hello routes --sort rule

The routes command automatically filters out internal methods like HEAD and OPTIONS unless you provide the --all-methods flag.

Step 4: Use the Interactive Shell​

The shell command opens an interactive Python session with the application context already pushed. This allows you to interact with current_app and other Flask globals directly.

flask --app hello shell

Inside the shell, you can verify the application name:

>>> from flask import current_app
>>> current_app.name
'hello'

The shell_command uses current_app.make_shell_context() to populate the local namespace, making it an ideal environment for testing database queries or configuration values.

Step 5: Create a Custom Management Script​

For advanced use cases, you might want to create a standalone script that behaves like the flask command but is tailored to your project. You can achieve this by using FlaskGroup as the class for a Click group.

Create a file named manage.py:

import click
from flask import Flask
from flask.cli import FlaskGroup

def create_my_app():
app = Flask(__name__)
# Additional configuration here
return app

@click.group(cls=FlaskGroup, create_app=create_my_app)
def cli():
"""Management script for my custom application."""
pass

@cli.command("hello-cli")
def hello_cli():
"""A custom command added to the group."""
click.echo("Hello from the custom CLI!")

if __name__ == "__main__":
cli()

In this example:

  1. We define a factory function create_my_app.
  2. We pass this factory to FlaskGroup via the create_app parameter.
  3. Because we use cls=FlaskGroup, our cli group automatically inherits the run, shell, and routes commands.
  4. We add a custom command hello-cli directly to the group.

You can now run your custom script directly:

python manage.py hello-cli
python manage.py routes

Summary​

By using the built-in CLI, you've learned how to:

  • Start a development server with run.
  • Inspect your URL map with routes.
  • Debug in an active application context with shell.
  • Extend the CLI using FlaskGroup to create custom management scripts.

For further customization, you can explore AppGroup, which ensures that any command added to it automatically runs within a Flask application context.