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