flask-restless-ng icon indicating copy to clipboard operation
flask-restless-ng copied to clipboard

Compress (gzip) the response of Flask-Restless-ng

Open Cabu opened this issue 7 months ago • 0 comments

If flask, I can have a decorator like:

def gzipped(function):
    @functools.wraps(function)
    def decorated_function(*args, **kwargs):
        @flask.after_this_request
        def zipper(response):
            accept_encoding = flask.request.headers.get('Accept-Encoding', '')

            if 'gzip' not in accept_encoding.lower():
                return response

            response.direct_passthrough = False

            if response.status_code < 200 or response.status_code >= 300 or 'Content-Encoding' in response.headers:
                return response

            gzip_buffer = io.BytesIO()
            gzip_file = gzip.GzipFile(mode='wb', fileobj=gzip_buffer)
            gzip_file.write(response.data)
            gzip_file.close()

            response.data = gzip_buffer.getvalue()
            response.headers['Content-Encoding'] = 'gzip'
            response.headers['Vary'] = 'Accept-Encoding'
            response.headers['Content-Length'] = len(response.data)

            return response
        return function(*args, **kwargs)
    return decorated_function

and add @gzipped to my route and have its result compressed before sending it back to the browser. But, how can I do something similar for the response of Flask-Restless-ng query?

Cabu avatar Nov 09 '23 10:11 Cabu