flask 接收gzip压缩数据

1. gzip 压缩

在http传输数据时,不论是服务端还是客户端,都可以对数据进行压缩,压缩数据可以减小http body的体积,提高性能。一方压缩后,在发送数据时,必须设置content-encoding, 明确告知对方自己所采用的压缩算法,否则,对方在收到数据后,无法进行有效的解压。同时,在发送数据时,可以通过设置accept-encoding来告诉对方,自己接受什么样的压缩数据。

2. 使用requests发送gzip压缩数据

进行gzip数据压缩,需要使用到gzip 模块,python3 需要使用BytesIO, python2 需要使用StringIO, 本文的代码在python3下测试可行

import requests
from io import BytesIO
import gzip
import json


url = 'http://127.0.0.1:5000/gzip'
data = {'name': 'coolpython'}
buf = BytesIO()

with gzip.GzipFile(mode='wb', fileobj=buf) as fp:
    gzip_value = json.dumps(data).encode()
    fp.write(gzip_value)

headers = {
    'content-encoding': 'gzip',
    'accept-encoding': 'gzip',
    'content-type': 'application/json;charset=UTF-8'
}
res = requests.post(url, data=buf.getvalue(), headers=headers)
print(json.loads(res.text))

buf.getvalue() 的数据类型是bytes,这一点与python明显不同

3. flask 接收gzip 数据

from flask import Flask, request
import io
import gzip
app = Flask(__name__)


@app.route("/gzip", methods=['POST'])
def my_gzip():
    content_encoding = request.headers['content-encoding']
    if content_encoding == 'gzip':
        buf = io.BytesIO(request.data)
        gf = gzip.GzipFile(fileobj=buf)
        content = gf.read().decode('UTF-8')

    return {'datra': content}


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

通过content-encoding 来判断压缩算法,读取request.data 数据,其类型是bytes, 在python3中,但凡涉及到网络数据传输的地方,都使用bytes类型数据,而Python2都使用str, 相应的一些数据处理过程中,python3用BytesIO,而Python使用StringIO

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案