Flask-Squeeze is a Flask extension that automatically:
- Minifies responses with JavaScript, CSS, and HTML content
- Compresses all responses with brotli (preferred), gzip, or deflate compression based on browser support
- Protects against the BREACH exploit by adding random padding to compressed responses
- Caches static files so they don't need to be re-compressed, with both in-memory and persistent disk caching options
- Optimizes performance with intelligent compression levels for static vs. dynamic content
- Works out-of-the-box - no changes needed to your existing Flask routes or templates
Files are considered static if the substring "/static/" is in their request path.
- Tested with Python 3.8, 3.9, 3.10, 3.11, 3.12 and 3.13
pip install Flask-Squeeze
from flask import Flask
from flask_squeeze import Squeeze
squeeze = Squeeze()
def create_app():
app = Flask(__name__)
# Init Flask-Squeeze
squeeze.init_app(app)
# Init all other extensions
# AFTER Flask-Squeeze
return app
Thats it! The responses of your Flask app will now get minified and compressed, if the browser supports it. To control how Flask-Squeeze behaves, the following options exist:
Option | Default | Description |
---|---|---|
SQUEEZE_COMPRESS |
True |
Enable/disable compression |
SQUEEZE_MIN_SIZE |
500 |
Minimum file size (bytes) to compress |
SQUEEZE_CACHE_DIR |
None |
Directory for persistent cache (None = in-memory only) |
SQUEEZE_VERBOSE_LOGGING |
False |
Enable debug output |
Option | Default | Description |
---|---|---|
SQUEEZE_MINIFY_CSS |
True |
Enable CSS minification |
SQUEEZE_MINIFY_JS |
True |
Enable JavaScript minification |
SQUEEZE_MINIFY_HTML |
True |
Enable HTML minification |
Option | Default | Range | Description |
---|---|---|---|
SQUEEZE_LEVEL_BROTLI_STATIC |
11 |
0-11 | Brotli level for static files |
SQUEEZE_LEVEL_BROTLI_DYNAMIC |
1 |
0-11 | Brotli level for dynamic content |
SQUEEZE_LEVEL_GZIP_STATIC |
9 |
0-9 | Gzip level for static files |
SQUEEZE_LEVEL_GZIP_DYNAMIC |
1 |
0-9 | Gzip level for dynamic content |
app.config.update({
'SQUEEZE_CACHE_DIR': './cache/flask_squeeze/', # Enable persistent caching
'SQUEEZE_MIN_SIZE': 1000, # Only compress files > 1KB
'SQUEEZE_VERBOSE_LOGGING': True, # Debug mode
})
- Report bugs by opening an issue
- Submit pull requests with improvements
- Improve documentation
git clone https://github.com/mkrd/Flask-Squeeze.git
cd Flask-Squeeze
uv sync
just test # Run tests
just run-test-app # Run test app
MIT License - see LICENSE file for details.