flask中使用proto3

简介:

  • 官方文档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)

原文地址:https://www.cnblogs.com/Klay/p/15341696.html