Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用烧瓶接收gzip_Python_Curl_Flask_Gzip - Fatal编程技术网

Python 用烧瓶接收gzip

Python 用烧瓶接收gzip,python,curl,flask,gzip,Python,Curl,Flask,Gzip,我正在尝试从HTTP POST接收Gzip JSON文件到Flask(v0.10)。我觉得在试图打开gzip之前,可能有一些额外的数据需要剥离 以下是我的代码: from flask import Flask, jsonify, request, abort import gzip, StringIO app = Flask(__name__) # Handle posted data @app.route('/', methods = ['POST']) def post_gzip():

我正在尝试从HTTP POST接收Gzip JSON文件到Flask(v0.10)。我觉得在试图打开gzip之前,可能有一些额外的数据需要剥离

以下是我的代码:

from flask import Flask, jsonify, request, abort
import gzip, StringIO
app = Flask(__name__)

# Handle posted data
@app.route('/', methods = ['POST'])
def post_gzip():

    # Check for a supported media type
    if (request.headers['Content-Type'] == 'application/x-gzip'):

        file = request.data
        f = gzip.open(file, 'rb')        

        return f;

    else:
        # 415 Unsupported Media Type
        abort(415)

if __name__ == "__main__":
    app.debug = True
    app.run()
我用cURL将一个压缩的JSON文件发布到Flask中,如下所示:

curl -X POST -d @test.json.gz http://127.0.0.1:5000/ -H "Content-Type:application/x-gzip" -H "Content-Encoding:gzip"
我收到的错误是:

UnicodeDecodeError: 'utf8' codec can't decode byte 0x8b in position 1: invalid start byte
Flask似乎无法将接收到的数据视为gz文件。也许请求。数据甚至都不是正确的使用方法


有没有什么好心的人能给我指出正确的方向呢?

你导入了
StringIO
,但从来没有真正使用过它,并将一个字符串输入到
gzip。打开需要文件名的
。您遇到的错误来自
gzip
试图在打开文件名之前将文件名解码为Unicode。 下面利用StringIO创建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()
...
编辑: 我已经重构了下面的代码,并发表了相关评论,以便更好地了解正在发生的事情:

from flask import Flask, request
import gzip, StringIO

app = 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()

对于Python2,公认的答案是正确的,但为了防止您在Python3中尝试这一点,您需要使用BytesIO而不是StringIO:

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

对于Python3,我只需要使用
gzip.decompress(request.data)
,它返回一个解压缩的字符串

这只是一个方便的速记功能,8年前添加:)

如果你想看看代码,你可以找到它


2019编辑:编写了一个可以在应用程序中使用的简单示例。

现在我遇到了以下错误:IOError:[Errno 22]无效模式('rb'))文件名或文件名名称::\ x1f\X8\X8\X8\x08\x08\x08\X8\X8\x08\X8\x08\x08\x08\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\x02\x02\xf7\xff问问问问问问问问问问问美国测试局局测试测试..测试...jsJS0 0\10 10 10 10\10 10 10 10 10 10 10 10\10 10\10 10 10 10\X6\X6\X8\X6\X8\X6\X8\X6\X6\X6\X8\X8\X8\X6\X8\X8\X8\X0 0 0 0 0\X8\X6\X6\X8\X6\\X8\X8\xff\xd1F\xd97\xbf\x94\xe2y\xe8q\xb6d\x94\x15\xb7\x94\xddf\xe5\x9c\xbfp\xc6\xe8/>`\x8c?“
从烧瓶导入烧瓶,请求导入gzip,StringIO app=flask(uuu name_uu)@app.route('/',methods=['POST'])def my_U函数():fakefile=StringIO.StringIO(request.data)解压缩=gzip.gzip文件(fakefile.read())文件()内容=f.read f.close()如果我将
uncompressed=gzip.gzip文件(fakefile.read())
更改为
uncompressed=gzip.gzip文件(fakefile.read())
uncompressed=gzip.gzip文件(fakefile)
我得到类型错误:强制到Unicode:需要字符串或缓冲区,实例发现请阅读以下内容:gzip.GzipFile使用fileobj命名参数获取类似文件的参数。您通过省略参数将其作为文件名传递。我答案的第三行显示了正确的用法。gzip.GzipFile(fakefile)在您的用例中是不正确的。感谢您对Iskren的支持,我的错误是忽略了fileobj。我现在有CRC检查问题。我会坚持下去的。再次感谢<代码>IOError:CRC检查失败0x2fe8c670!=0x0L
很好,谢谢您的扩展!只是想知道:您是否体验过任何性能影响?我们有一个端点,它接受一个普通JSON对象,该对象包含一个带有gzip编码字符串的属性。如果这个字符串在端点内被gzip解码,那么性能将是惊人的。当您将其作为扩展的装饰器时,吞吐量会大大降低(以防它必须启动)。有什么想法吗?对于感兴趣的人,我继续与@boesing讨论