通过 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 压缩过的页面。