通过 URL 传递参数让 Flask 支持数据 Gzip 压缩

用 Flask 写了一套 REST API,不过返回的数据量比较大(有些几十 MB),在网络环境不好的情况下延迟很大,因此希望让返回的数据用 Gzip 压缩下,但默认不压缩数据,而是在 URL 中指定了“gz”参数后才会压缩,参考 https://github.com/closeio/Flask-gzip 写了一个插件 Flask-Gz.py:

# coding=utf-8

import gzip
from io import BytesIO

from flask import request


class Gzip(object):
    def __init__(self, app, compress_level=6, minimum_size=500):
        self.app = app
        self.compress_level = compress_level
        self.minimum_size = minimum_size
        self.app.after_request(self.after_request)

    def after_request(self, response):
        if "gz" not in request.args:
            return response

        # 如果 URL 中带有“gz”参数,就返回 Gzip 压缩后的内容
        gzip_buffer = BytesIO()
        gzip_file = gzip.GzipFile(mode='wb',
                                  compresslevel=self.compress_level,
                                  fileobj=gzip_buffer)
        gzip_file.write(response.get_data())
        gzip_file.close()
        response.set_data(gzip_buffer.getvalue())
        response.headers['Content-Encoding'] = 'gzip'
        response.headers['Content-Length'] = len(response.get_data())
        return response

示例代码:

from flask import Flask
from Flask_Gz import Gzip

app = Flask(__name__)
gzip = Gzip(app)


@app.route('/')
def index():
    return '<h1>Hello World!</h1>'


if __name__ == '__main__':
    app.run(debug=True)

访问 http://127.0.0.1:5000/?gz 即返回经 Gzip 压缩过的页面。