zoukankan      html  css  js  c++  java
  • 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)
    
    
  • 相关阅读:
    序列
    2018131
    成都七中
    NOIP2017
    洛谷P1352 CodeVS1380 没有上司的舞会
    BZOJ1087 SCOI2005 互不侵犯King
    11-4-2017 星期六 R-Day?
    11-3-2017 星期五
    11-2-2017 星期四
    USACO 2014 US Open, Silver Problem 2. Dueling GPSs
  • 原文地址:https://www.cnblogs.com/Klay/p/15341696.html
Copyright © 2011-2022 走看看