Receiving gzip with Flask Receiving gzip with Flask flask flask

Receiving gzip with Flask


For Python 3, I would just use gzip.decompress(request.data) which returns a decompressed string.

It's just a convenient shorthand function, added 8 years ago :)

If you want to take a look at the code, you can find it here.

2019 edit: wrote a simple flask extension you can use in your app.


The accepted answer is correct for Python 2, but just in case you're trying this with Python 3, you need to use BytesIO instead of StringIO:

compressed_data = io.BytesIO(request.data)text_data = gzip.GzipFile(fileobj=compressed_data, mode='r')


You import StringIO but never actually utilize it and feed a string to gzip.open which requires a filename. The error you're getting is from gzip trying to decode the filename to Unicode before attempting to open it.The following utilizes StringIO to make a file-like object that can be used by gzip:

...fakefile = StringIO.StringIO(request.data) # fakefile is now a file-like object thta can be passed to gzip.GzipFile:uncompressed = gzip.GzipFile(fileobj=fakefile, mode='r')return uncompressed.read()...

Edit:I've refactored the code below and put relevant comments for a better understanding of what is going on:

from flask import Flask, requestimport gzip, StringIOapp = Flask(__name__)@app.route('/', methods = ['POST'])def my_function():    # `request.data` is a compressed string and `gzip.GzipFile`    # doesn't work on strings. We use StringIO to make it look    # like a file with this:    fakefile = StringIO.StringIO(request.data)    # Now we can load the compressed 'file' into the     # `uncompressed` variable. While we're at it, we    # tell gzip.GzipFile to use the 'rb' mode    uncompressed = gzip.GzipFile(fileobj=fakefile, mode='rb')    # Since StringIOs aren't real files, you don't have to     # close the file. This means that it's safe to return    # its contents directly:    return uncompressed.read()if __name__ == "__main__":    app.debug = True    app.run()