• 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)
    
    
  • 相关阅读:
    CodeForces 347B Fixed Points (水题)
    CodeForces 347A Difference Row (水题)
    CodeForces 346A Alice and Bob (数学最大公约数)
    CodeForces 474C Captain Marmot (数学,旋转,暴力)
    CodeForces 474B Worms (水题,二分)
    CodeForces 474A Keyboard (水题)
    压力测试学习(一)
    算法学习(一)五个常用算法概念了解
    C#语言规范
    异常System.Threading.Thread.AbortInternal
  • 原文地址:https://www.cnblogs.com/Klay/p/15341696.html
Copyright © 2020-2023  润新知