Skip to main content
Tests Coverage

Auto-detects your static files for minification, combination, and versioning. Like Django-Compressor for Flask.

Installation

pip install flask-static-compress

Usage

Just wrap your existing css/js with a compress block and Flask-Static-Compress handles the rest:

{% compress 'css' %}
  <link rel="stylesheet" type="text/sass" href="file.sass">
{% endcompress %}

{% compress 'js' %}
  <script type="text/javascript" src="file.js"></script>
{% endcompress %}

Also, initialize the extension inside your Flask app:

from flask_static_compress import FlaskStaticCompress
app = Flask(__name__)
compress = FlaskStaticCompress(app)

All static assets inside a compress block are compressed into a single file, and your html is updated to the new path when rendering the template.

For example:

{% compress 'js' %}
  <script type="text/javascript" src="{{ STATIC_URL }}js/config.js"></script>
  <script type="text/javascript" src="{{ STATIC_URL }}js/app.js"></script>
{% endcompress %}

Is turned into:

<script type="text/javascript" src="/static/sdist/a041936b125a3ec4ce9bf7a83130157d.js"></script>

The compressed a041936b125a3ec4ce9bf7a83130157d.js contains both app.js and config.js combined for faster page loading. The file name is calculated based on the contents of app.js and config.js. This means any change to your static code is automatically reloaded, or cache-busted, in browsers.

With debug mode turned on, file names and line numbers are preserved while still running the compression flow:

<script type="text/javascript" src="/static/sdist/93a97ef5491b84db5155916be8f8fd7f-config.js"></script>
<script type="text/javascript" src="/static/sdist/af77fa42b92bb5a1ef85d9eb773d608e-app.js"></script>

The type attribute is used to decide which compressor to use for the asset.

Use offline compression for improved performance.

Create custom compressors to support more types of static files.

For example, to remove trailing commas with Prettier then compress with jsmin:

import errno
import subprocess
from jac.compat import file, u, utf8_encode
from jac.exceptions import InvalidCompressorError
from rjsmin import jsmin


class CustomJavaScriptCompressor(object):
    binary = 'prettier'

    @classmethod
    def compile(cls, content, mimetype='text/less', cwd=None, uri_cwd=None,
                debug=None):
        if debug:
            return content

        args = ['--no-config', '--trailing-comma', 'none']

        args.insert(0, cls.binary)

        try:
            handler = subprocess.Popen(args,
                                       stdout=subprocess.PIPE,
                                       stdin=subprocess.PIPE,
                                       stderr=subprocess.PIPE, cwd=None)
        except OSError as e:
            msg = '{0} encountered an error when executing {1}: {2}'.format(
                cls.__name__,
                cls.binary,
                u(e),
            )
            if e.errno == errno.ENOENT:
                msg += ' Make sure {0} is in your PATH.'.format(cls.binary)
            raise InvalidCompressorError(msg)

        if isinstance(content, file):
            content = content.read()
        (stdout, stderr) = handler.communicate(input=utf8_encode(content))
        stdout = u(stdout)

        if handler.returncode == 0:
            return jsmin(stdout)
        else:
            raise RuntimeError('Error compressing: %s' % stderr)


COMPRESSOR_CLASSES = {
    'text/javascript': CustomJavaScriptCompressor,
}

Configuration

COMPRESSOR_ENABLED Default: True

COMPRESSOR_OFFLINE_COMPRESS Default: False

COMPRESSOR_FOLLOW_SYMLINKS Default: False

COMPRESSOR_DEBUG Default: False

COMPRESSOR_OUTPUT_DIR Default: app.static_folder + ‘/sdist’

COMPRESSOR_CACHE_DIR Default: app.static_folder + ‘/sdist’

COMPRESSOR_STATIC_PREFIX Default: app.static_url_path + ‘/sdist’

COMPRESSOR_CLASSES Default:

[
    'text/css': LessCompressor,
    'text/coffeescript': CoffeeScriptCompressor,
    'text/less': LessCompressor,
    'text/javascript': JavaScriptCompressor,
    'text/sass': SassCompressor,
    'text/scss': SassCompressor,
]

Thanks to Jay Santos, creator of jac. Flask-Static-Compress is just a wrapper around jac!

Release files for Flask-Static-Compress 1.0.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for Flask-Static-Compress 1.0.3
File Size Uploaded
Flask-Static-Compress-1.0.3.tar.gz 5.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for Flask-Static-Compress 1.0.3
File Interpreter ABI Platform
Flask_Static_Compress-1.0.3-py3-none-any.whl Python 3 none any Details

Total release size: 10.6 kB

Release files / Flask-Static-Compress-1.0.3.tar.gz

Download URL Flask-Static-Compress-1.0.3.tar.gz
Size 5.2 kB
Tags Source
SHA-256 checksum
How to use checksums
0cc3e97c6789626d8f468b35c16ab37267527309b3b3d3a46e911d0c28e003c7
BLAKE2b-256 checksum
How to use checksums
0e577a53c39b42ab56932f01e2ee7c2312d39117ef534b56cae74a03f8ada02f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/46.0.0 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.7.7

Release files / Flask_Static_Compress-1.0.3-py3-none-any.whl

Download URL Flask_Static_Compress-1.0.3-py3-none-any.whl
Size 5.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f5a3567ac262ce85fa50438a3f2ffd1509cebe9a0adc8393570763fde8c97a1c
BLAKE2b-256 checksum
How to use checksums
311cf4a855d2f9a013e488ba01e348612ba44c0c24195f3302c8ce464f19bad2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/46.0.0 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.7.7

Release history Release notifications | RSS feed

This release

1.0.3 This release

2 release files

1.0.2

1 release file

1.0.1

1 release file

1.0.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page