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.
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()