简介:
- 官方文档proto3
- 本文主要介绍 在flask 中使用 proto3
- 什么是protobuf:Protocol Buffers,简称protobuf或pb,是Google公司开发的一种数据描述语言,类似于XML和JSON能够将结构化数据序列化用于数据存储、通信协议等方面。
为什么要用protobuf
- pb主要解决是使用更小的带宽占用达到更快的传输速度。
- 本质:data->pb压缩数据->网络传输->pb解析数据->data
缺点
- 没有json 那么容易理解和直观
- 需要安装一大堆依赖
- 使用起来没有json那么方便,pb文件定义很容易出现bug,尤其是在app中使用容易出现兼容性bug(后台pb变更,老版本app解析不了)
- 相对用json 测试工具需要自己开发。
- 每次pb变更都需要打包,测试起来会比较麻烦
- 使用一些 RESTful 风格的依赖的时候会比较麻烦。
优点
- 使用更小的带宽占用达到更快的传输速度
- 省区了沟通上的麻烦,后台定义好pb后丢给前端(使用数据的)就好了,不会反复扯皮
flask app
定义pb协议,demo.proto
syntax = "proto3";
package tutorial;
// 请求
message Request{
optional int32 page = 1;
optional int32 count = 2;
repeated int32 test_list = 3;
}
message Response{
// // 响应体
int32 page = 1;
int32 pageSize = 2;
string data = 3;
}
flask app 解析请求和压缩返回,app.py
from flask import Flask, request
from demo_pb2 import Request,Response
app = Flask(__name__)
@app.route('/test',methods=["POST","GET"])
def hello_world():
req_data = Request()
# request.get_data(): b'x08x01x10x14x1ax02x01x02'
print("request.get_data(): ",request.get_data())
req_data.ParseFromString(request.get_data())
#count 20
print("count", req_data.count)
#page 1
print("page", req_data.page)
# test_list [1, 2]
print("test_list", req_data.test_list)
resp = Response()
resp.page = req_data.page
resp.pageSize = req_data.count
resp.data = "data"
return resp.SerializeToString(), 200
if __name__ == '__main__':
app.run()
接口请求,压缩请求和解析返回
import requests
from demo_pb2 import Request,Response
req_data = Request()
req_data.page = 1
req_data.count = 20
req_data.test_list[:]=[1,2]
req_data = req_data.SerializeToString()# 序列化
resp = requests.post("http://127.0.0.1:5000/test", data=req_data)
resp_data = Response()
resp_data.ParseFromString(resp.content) # resp.content 返回的bytes
print(resp_data)