How to Configure Flask for Production: Best Practices
To configure
Flask for production, use a production-ready WSGI server like gunicorn or uWSGI instead of the built-in server. Set FLASK_ENV=production and disable debug mode to improve security and performance.Syntax
Flask's built-in server is for development only. For production, you run Flask with a WSGI server. The common syntax to start a Flask app with gunicorn is:
gunicorn module_name:app- runs the Flask app object from your module.- Set environment variables like
FLASK_ENV=productionto disable debug mode. - Configure server options such as workers and binding address.
bash
gunicorn myapp:app --workers 4 --bind 0.0.0.0:8000
Example
This example shows a simple Flask app configured to run with gunicorn in production mode. It disables debug mode and uses environment variables.
python
from flask import Flask import os app = Flask(__name__) @app.route('/') def hello(): return 'Hello, Production Flask!' if __name__ == '__main__': debug_mode = os.environ.get('FLASK_ENV') != 'production' app.run(debug=debug_mode)
Output
When run with FLASK_ENV=production and started via gunicorn, the app serves requests without debug info.
Common Pitfalls
Many developers mistakenly use Flask's built-in server in production, which is not designed for performance or security. Another common mistake is leaving debug=True enabled, which can expose sensitive information.
Also, forgetting to set FLASK_ENV=production or not using a WSGI server leads to poor performance and security risks.
python
Wrong way: app.run(debug=True) Right way: # Set environment variable FLASK_ENV=production app.run(debug=False)
Quick Reference
- Use
gunicornoruWSGIto serve Flask apps in production. - Set
FLASK_ENV=productionto disable debug mode. - Configure multiple workers for better performance.
- Use environment variables for secret keys and configs.
- Enable HTTPS and proper logging in production.
Key Takeaways
Always use a WSGI server like gunicorn to run Flask in production.
Set FLASK_ENV=production to disable debug mode and improve security.
Never use Flask's built-in server for production workloads.
Configure multiple worker processes for better performance.
Manage secrets and configs via environment variables, not in code.