如何使用Python中的Flask压缩/最小化JSON/Jsonify的大小?

lak*_*erz 9 javascript python json flask

我经常向我的网页发送一个巨大的JSON字符串(在Flask中使用jsonify),所以我想减少数据.最简单的选择可能是删除所有换行符和空格字符,但只是给你一个例子:

普通jsonify:361KB
删除所有换行符和空格字符:118KB(哇).
压缩原始文件:35KB(双哇).

所以我基本上想知道是否有一种简单的方法来接近35KB.到目前为止我找不到一个解决方案,我可以在python和javascript(解压缩)中轻松实现.

现在,我每秒发送大约4-5MB的数据,这是 - 你猜对了 - 一点点"太多".

Rip*_*346 20

老问题,但我正在搜索这个,这是谷歌上的第一个结果。Leon 的答案链接有一个不适用于 Flask 的解决方案,而且它也很旧。现在使用 Python 3,我们可以使用标准库(和 Flask)在几行代码中完成所有工作:

from flask import make_response, json
import gzip

@app.route('/data.json')
def compress():
    very_long_content = [{'a': 1, 'b': 2}, {'c': 3, 'd': 4}]
    content = gzip.compress(json.dumps(very_long_content).encode('utf8'), 5)
    response = make_response(content)
    response.headers['Content-length'] = len(content)
    response.headers['Content-Encoding'] = 'gzip'
    return response
Run Code Online (Sandbox Code Playgroud)

使用gzip.compress我们直接压缩了一个字节字符串,它需要一个字节字符串作为输入。然后,作为来自 Leon 的链接,我们进行了自定义响应,说明内容是 gzip,因此浏览器将自行解压缩。

对于使用 JQuery ajax 请求在 Javascript 中解码,与标准请求没有任何特别的区别:

$.ajax({
    url: '/data.json',
    dataType: 'json',
    success: function(data) {
        console.log(data);
    }
})
Run Code Online (Sandbox Code Playgroud)

请注意,此代码段压缩然后发送长内容。您应该考虑压缩内容所需的时间(特别是在我们有很长内容的情况下),因此请确保设置适当的压缩级别,压缩 + 发送所需的时间不会超过发送时间内容很长。

我的用例是我从慢速连接发送大内容,所以我有所有的好处在发送之前压缩内容。

  • 此外,我还添加了一个检查,确保请求可以在响应中处理 gzip: `if 'gzip' in request.headers.get('Accept-Encoding','').lower()` (2认同)

Nic*_*ick 12

如果您正在寻找一个库来帮助通过 Gzip(或 Brotli)提供压缩内容,请尝试flask-compress。这很简单;这可能就是您需要做的全部:

from flask import Flask
from flask_compress import Compress

app = Flask(__name__)
Compress(app)
Run Code Online (Sandbox Code Playgroud)


Leo*_*eon 11

Web请求确实支持GZip,您可以在python中实现它.

这是有人提出这个确切的问题. 如何使用Content-Encoding:使用Python SimpleHTTPServer的gzip

但是因为你正在使用flask,所以有一个组件可以做到这一点:https: //flask-compress.readthedocs.org/en/latest/ 这里也是一个示例代码片段,如果你想对特定视图进行压缩. http://flask.pocoo.org/snippets/122/

如果你使用gzip路径,则不需要删除换行符和空格,但是如果你仍然想根据烧瓶文档,你可以通过将JSONIFY_PRETTYPRINT_REGULAR设置为false来禁用漂亮的打印. http://flask.pocoo.org/docs/0.10/config/