How to Run a Flask App Successfully: Complete Guide from Development to Production
Set the FLASK_APP environment variable to your Python file or application factory function, then execute flask run to start the development server on http://127.0.0.1:5000.
Flask is a lightweight WSGI web framework maintained by the Pallets Projects that builds applications by instantiating the Flask class. Understanding how to run a Flask app successfully requires knowledge of the CLI discovery mechanism implemented in src/flask/cli.py and the core application structure defined in src/flask/app.py. This guide covers the exact steps to launch your application in both development and production environments using the official pallets/flask source code.
Creating Your Flask Application
Before running your app, you must create a valid Flask instance. The framework supports two primary patterns for application creation, both implemented in src/flask/app.py.
The Minimal Single-File Pattern
For simple projects, create a file named app.py:
# app.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello, World!"
The Flask class constructor initializes the WSGI application, while the route decorator provides a thin wrapper around the add_url_rule method for registering endpoints.
The Application Factory Pattern
For larger projects, defer application creation using a factory function in myproject/__init__.py:
from flask import Flask
def create_app():
app = Flask(__name__)
app.config.from_mapping(SECRET_KEY="dev")
@app.route("/")
def index():
return "Welcome to the factory app!"
return app
This pattern allows lazy loading of extensions and simplifies testing with different configurations, as the Flask constructor in src/flask/app.py supports deferred initialization.
Starting the Development Server
Using the Flask CLI
The Flask command-line interface defined in src/flask/cli.py reads the FLASK_APP environment variable to locate and import your application object.
For the single-file pattern:
export FLASK_APP=app.py
export FLASK_ENV=development
flask run
For the factory pattern, use the colon syntax:
export FLASK_APP="myproject:create_app"
flask run
The CLI detects the colon separator, imports the module, calls the factory function, and serves the returned instance. By default, the development server binds to 127.0.0.1:5000.
Customizing Host and Port
Override default network settings using environment variables:
export FLASK_RUN_HOST=0.0.0.0
export FLASK_RUN_PORT=8080
flask run
Or pass arguments directly:
flask run --host 0.0.0.0 --port 8080 --no-debugger
The --no-debugger flag explicitly disables the interactive debugger, which is essential when exposing the server to external networks.
Understanding the Application Discovery Process
When you execute flask run, the CLI performs a specific initialization sequence:
- Locate the application: Imports the module specified in
FLASK_APPand searches for an instance namedappor executes the factory function when using themodule:factorysyntax. - Initialize the environment: Sets
FLASK_ENV=developmentautomatically if undefined, which enables the interactive debugger and auto-reloader managed throughflask.signals. - Load configuration: Processes settings from the
app.configobject (defined insrc/flask/config.py) via methods likefrom_objectorfrom_pyfile. - Prepare context: Initializes the
AppContextandRequestContextclasses fromsrc/flask/ctx.pyto manage thread-local variables likeflask.gandflask.request. - Start the server: Invokes the Werkzeug development server through the internal
app.run()method.
Running Flask in Production
Using Production WSGI Servers
Do not use flask run for production deployments. Instead, expose the wsgi_app attribute to a dedicated WSGI server:
gunicorn "myproject:create_app()"
The parentheses instruct Gunicorn to call the factory immediately. The production server then uses the app.wsgi_app callable defined in src/flask/app.py to handle requests, bypassing the development server's single-threaded limitations.
Configuration and Environment Variables
Flask's configuration system in src/flask/config.py recognizes several key environment variables:
FLASK_APP: Path to the file or factory function (e.g.,app.pyormyproject:create_app).FLASK_ENV: Controls environment-specific behavior; set todevelopment(default) orproduction.FLASK_DEBUG: Enables debug mode independently of the environment setting.FLASK_RUN_HOSTandFLASK_RUN_PORT: Override the default127.0.0.1:5000binding.
When FLASK_ENV=development, Flask automatically enables the reloader and debugger through signal handlers defined in src/flask/signals.py.
Summary
- Set
FLASK_APPto your Python file or factory function before executingflask runto start the development server. - Use the application factory pattern (
create_app) for complex projects to enable flexible configuration and testing. - Core architecture relies on
src/flask/app.pyfor theFlaskclass,src/flask/cli.pyfor command-line discovery, andsrc/flask/config.pyfor settings management. - Never use
flask runin production; deploy using Gunicorn or similar WSGI servers that consumeapp.wsgi_app. - Default security binds to
127.0.0.1with the debugger enabled only in development mode.
Frequently Asked Questions
What should I set FLASK_APP to if using an application factory?
Set FLASK_APP to the module path followed by a colon and the factory name, such as myproject:create_app. The Flask CLI in src/flask/cli.py parses this syntax, imports the module, calls the factory, and serves the returned Flask instance.
Why does Flask default to 127.0.0.1 instead of 0.0.0.0?
The default binding to 127.0.0.1 in src/flask/cli.py prevents accidental exposure of the development server to external networks, protecting against security risks since the interactive debugger allows arbitrary code execution. Use --host 0.0.0.0 only when explicitly required.
How do I disable the debugger but keep auto-reload?
Pass the --no-debugger flag to flask run or set FLASK_DEBUG=0. This prevents the interactive debugger from rendering tracebacks while maintaining the reloader functionality useful during development.
Can I use flask run for production deployments?
No. The server started by flask run is designed for development only and lacks the performance and security features required for production. Deploy using a production-grade WSGI server like Gunicorn, uWSGI, or mod_wsgi that imports your application from src/flask/app.py and utilizes the wsgi_app interface.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →