背景:需要用django基于python3模拟一个http接口,请求是post方式,body是protobuf string,返回也是protobuf string

设计:django获取pb string的post body反序列化成json,通过json里面的指定字段的值获取对应的返回json, 并将返回的json序列化成pb string

重点:需要用python实现基于protobuf协议将json转化为pb string,将pb string转成json

步骤:

1.安装protobuf

安装protobuf,可直接下载编译后的压缩包直接解压后配置环境变量使用,我这里使用源码包安装方式【mac or linux】

下载源码包 https://github.com/protocolbuffers/protobuf/release

直接点击下载图示包,或者右键复制下载链接再通过wget下载

解压并安装

tar -zxvf protobug-all-3.6.1.tar.gz

cd protobuf-3.6.1 && ./configure && make && make check && make install

执行完毕之后通过命令 protoc --version校验是否安装成功,能显示版本则表示安装成功

2.python安装protobuf,直接通过pip安装

pip3 install protobuf

安装完成之后能成功导入 google.protobuf表示成功

3.根据协议生成python文件

将protobuf协议原文件openrtb.proto放在example目录包下,并执行命令则会生成对应的py文件openrtb_pb2.py

protoc  --python_out=. openrtb.proto

4.实现pb和json的相互转换

from example import openrtb_pb2
from google.protobuf.json_format import MessageToJson, Parse # 将pbStringRequest【protobuf string类型的请求body】转化为json string以便解析请求中的某个指定参数
def pb_to_json(pbStringRequest){   
  req = openrtb_pb2.BidRequest()   
  req.ParseFromString(pbStringRequest)   
  jsonStringRequest = MessageToJson(req)
  return jsonStringRequest
} # 将jsonStringResponse转化为pbString返回
def json_to_pb(jsonStringResponse){
  bidResponse = openrtb_pb2.BidResponse()
  Parse(jsonStringResponse, bidResponse)
  pbStringResponse = bidResponse.SerializeToString()
  return pbStringResponse
}

python 处理protobuf协议的更多相关文章

  1. python爬虫之protobuf协议介绍

    前言 在你学习爬虫的知识过程中是否遇到下面的类型.如果有兴趣学习一下或者了解相关知识的,且不嫌在下才疏学浅,可以参考一下.欢迎各位网友的指正. 首先叙述一下问题的会出现的式样. 你可能会在请求参数中看 ...

  2. python通过protobuf实现rpc

    由于项目组现在用的rpc是基于google protobuf rpc协议实现的,所以花了点时间了解下protobuf rpc.rpc对于做分布式系统的人来说肯定不陌生,对于rpc不了解的童鞋可以自行g ...

  3. 初次使用Python脚本,proto协议文件转Lua代码

    使用IntelliJ IDEA编辑器编写Lua脚本的时候,安装一个插件 "EmmyLua" 可以对有代码提示功能 想把protoBuf协议文件转成Lua代码,然后给出代码提示 第一 ...

  4. Protobuf 协议语言指南

    l  定义一个消息(message)类型 l  标量值类型 l  Optional 的字段及默认值 l  枚举 l  使用其他消息类型 l  嵌套类型 l  更新一个消息类型 l  扩展 l  包(p ...

  5. mac环境使用python处理protobuf

    安装 brew install protobuf 然后再安装protobuf需要的依赖 brew install autoconf automake libtool 验证是否安装成功 protoc – ...

  6. protobuf 协议浅析

    目录 Protobuf 协议浅析 1. Protobuf 介绍 1.1 Protobuf 基本概念 1.2 Protobuf 的优点 1.3 Protobuf, JSON, XML 的区别 2. Pr ...

  7. Python使用Protobuf&&如何赋值&&如何正反序列化

    前言 使用protobuf主要是两个步骤,序列化和反序列化. 关于Proto有哪些数据类型,然后如何编写,此处就不赘述了,百度一下有很多. 此文主要是总结,python使用protobuf的过程,如何 ...

  8. 杂项之python描述符协议

    杂项之python描述符协议 本节内容 由来 描述符协议概念 类的静态方法及类方法实现原理 类作为装饰器使用 1. 由来 闲来无事去看了看django中的内置分页方法,发现里面用到了类作为装饰器来使用 ...

  9. Google的Protobuf协议分析

    protobuf和thrift类似,也是一个序列化的协议实现,简称PB(下文出现的PB代表protobuf). Github:https://github.com/google/protobuf 上图 ...

随机推荐

  1. 如何知道一个路由器的 BSSID ?

    使用 Mac 连接上这个路由器,然后使用 option 按 wifi 按钮,可以在详情页里找到. 有些路由中继的设置需要使用 BSSID ,比如 pandorabox openwrt

  2. opencv —— getRotationMatrix2D、warpAffine 仿射变换实现图像旋转缩放

    仿射变换的基本概念 仿射变换是一种二维坐标(x, y)到二维坐标(u, v)的线性变换,其数学表达式形式如下: 对应的齐次坐标矩阵表示形式为: 仿射变换保持了二维图形的“平直性”(直线经仿射变换后依然 ...

  3. vim 进化 编码问题

    " 解决菜单乱码 source $VIMRUNTIME/delmenu.vim source $VIMRUNTIME/menu.vim " 防止文件显示乱码 set fileenc ...

  4. .net core 3.0配置跨域

    1.ConfigureServices services.AddCors(c => { // 配置策略 c.AddPolicy("Policy", policy => ...

  5. IE浏览器中IFrame被加载两次问题的解决-sunziren

    本文为作者sunziren原创,首发博客园,转载请注明出处. 昨天遇到了一个问题,先上代码. var content = '<iframe src="www.baidu.com&quo ...

  6. #6499. 「雅礼集训 2018 Day2」颜色 [分块,倍增,bitset]

    bitset压位,因为是颜色数,直接倍增,重合部分不管,没了. // powered by c++11 // by Isaunoya #include <bits/stdc++.h> #d ...

  7. mac本地安装全局包报错npm WARN checkPermissions

    安装本地全局包时,本地报错 npm WARN checkPermissions Missing write access to /Users/xxx/.nvm/versions/node/v11.10 ...

  8. Photoshop Elements2020强势来袭,教你三秒钟拯救闭眼照

    Photoshop Elements2020强势来袭,一系列的黑科技让设计师和路人都惊叹不已!若某人的闭眼成为一张集体照的败笔,那该如何挽回? 想要挽救闭眼照?听起来很高大上,很困难?不,Photos ...

  9. Wannafly Winter Camp 2020 Day 6D 递增递增 - dp,组合数学

    给定两个常为 \(n\) 的序列 \(l_i,r_i\),问夹在它们之间 ( \(\forall i, l_i \leq a_i \leq r_i\) ) 的不降序列的元素总和. Solution 先 ...

  10. 剑指offer-基础练习-快速排序-排序

    /* 题目:快速排序 */ /* 思路:将一个数组分为两份,左边的数字小于index,右边的数字大于index,递归划分后形成一个排序后的数组. */ void QuickSort(int data[ ...