• protobuf和flask结合高效数据传输


    protobuf和flask结合

    • Protobuf(Google Protocol Buffers)是google开发的的一套用于数据存储,网络通信时用于协议编解码的工具库.它和XML和Json数据差不多,把数据已某种形式保存起来.Protobuf相对与XML和Json的不同之处,它是一种二进制的数据格式,具有更高的传输,打包和解包效率

    flask使用protobuf

    • 首先安装protobuf

      pip install protobuf
      
    • 安装protoc, 下载地址protobuf,我用的是windows 64位,去github下载 protoc-3.13.0-win64.zip

    • 解压到项目下:

    • 安装protobuf插件,settings->plugins->Marketplace,找到下面2个进行安装

    • 编辑ProtobufRR.proto文件

      syntax = "proto3";
      
      
      // 响应体
      message Response {
        int32 returncode = 1;
        message data {
          string username = 1;
          int32 age = 2;
        }
        repeated data dataList = 2;
        string message = 3;
      }
      
      // 请求体
      message Request {
        string data = 1;
        int32 page = 2;
        int32 pageSize = 3;
      }
      
      
    • 将protobufRR.proto转换python

      binprotoc.exe --python_out=./ ProtobufRR.proto
      
    • 此时会生成ProtobufRR_pd2.py文件

    • 编写flask服务端

      #!/usr/bin/env python
      # -*- coding:utf-8 -*-
      """
      # Author Xu Junkai
      # coding=utf-8
      # @Time    : 2021/4/3 0:23
      # @Site    :
      # @File    : manage.py
      # @Software: PyCharm
      """
      from ProtobufRR_pb2 import Request, Response
      from flask import Flask, request
      app=Flask(__name__)
      @app.route("/my_protobuf", methods=["POST"])
      def my_protobuf():
          # 解析请求
          request_data = Request()
          request_data.ParseFromString(request.get_data())
          print("data",request_data.data)# data user
          print("page",request_data.page)# page 1
          print("pageSize",request_data.pageSize)# pageSize 10
          # 编写响应
          response = Response()
          response.returncode = 200
          response.message = "成功"
          d1 = response.data()
          d1.username = "小明"
          d1.age = 23
          d2 = response.data()
          d2.username = "小红"
          d2.age = 21
          response.dataList.append(d1)# 添加dataList里
          response.dataList.append(d2)
          return response.SerializeToString(), 200
      
      if __name__ == '__main__':
          app.run("127.0.0.1", port=5000)
      
      
    • 编写测试脚本

      #!/usr/bin/env python
      # -*- coding:utf-8 -*-
      """
      # Author Xu Junkai
      # coding=utf-8
      # @Time    : 2021/4/3 0:34
      # @Site    :
      # @File    : request_server.py
      # @Software: PyCharm
      """
      from ProtobufRR_pb2 import Request, Response
      import requests
      def test_my_protobuf():
          """
          测试 protobuf
          :return:
          """
          request_data = Request()
          request_data.data = "user"
          request_data.page = 1
          request_data.pageSize = 10
          req_data = request_data.SerializeToString()# 序列化
          response = requests.post("http://127.0.0.1:5000/my_protobuf", data=req_data)
          res = Response()
          res.ParseFromString(response.content)# 反序列化
          print(res.returncode)# 200
          print(res.message)# 成功
          print(res.dataList)
          """
          [username: "345260217346230216"
          age: 23
          , username: "345260217347272242"
          age: 21
          ]
          """
          for d in res.dataList:
              print(f"username:{d.username}, age:{d.age}")
              # username:小明, age:23
              # username:小红, age:21
      if __name__ == '__main__':
          test_my_protobuf()
      
      
    • 参考:

      https://blog.csdn.net/u013210620/article/details/81317731

      https://blog.csdn.net/weixin_39841709/article/details/111292232

      https://github.com/protocolbuffers

  • 相关阅读:
    是什么造成了数据库的卡顿
    机器学习笔记(六) ---- 支持向量机(SVM)
    机器学习笔记(五)---- 决策树
    了解 MongoDB 看这一篇就够了【华为云分享】
    王晶:华为云OCR文字识别服务技术实践、底层框架及应用场景 | AI ProCon 2019
    【HUAWEI Mate30】抽奖啦!华为IoT新福利上线!
    高性能Web动画和渲染原理系列(2)——渲染管线和CPU渲染
    【华为云社区】悟一下动态规划
    理解递归与动态规划
    Laravel 文件上传失败的问题 error 7
  • 原文地址:https://www.cnblogs.com/xujunkai/p/14612990.html
Copyright © 2020-2023  润新知