3
\$\begingroup\$

Flask comes with built-in static file serving, but compression support is completely missing. I think the way whitenoise implements it and compress files during builds. The following should serve the compressed static files.

import os

from flask import current_app, request, safe_join


def send_compressed_file(filename, formats=[('br', 'br'), ('gzip', 'gz')]):
    if not current_app.has_static_folder:
        raise RuntimeError('No static folder for the current application')
    accept_encoding = request.headers.get('Accept-Encoding', None)
    if not accept_encoding:
        return current_app.send_static_file(filename)
    encodings = [encoding.trim() for encoding in accept_encoding.split(',')]
    for format, extension in formats:
        compressed = filename + extension
        if format in encodings and os.path.exists(safe_join(current_app.static_folder, compressed)):
            return current_app.send_static_file(compressed)
    return current_app.send_static_file(filename)

Than I would simply hook it into the Flask object.

def production():
    app.view_functions['static'] = send_compressed_file
    return app

Because it is very performance critical (every static file request hits this function) I would like to get some performance suggestions. Promblems that I encountered myself:

  • I think os.path.exists is not efficient? How could I store file paths better?
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.