当前位置: 首页 > wzjs >正文

教育网站制作北京seo平台

教育网站制作,北京seo平台,抖音 运营,免费软件推荐项目结构文件介绍generated目录用于存储编译后的pb2文件 proto/user.proto定义的user协议 client.py模拟前后端分离向后端发起请求 server.py利用Flask创建简易web应用提供获取数据接口依赖安装protobuf4.25.3 flask3.0.2 flask-cors4.0.0(base) PS ......\protobuf-demo> c…

项目结构

文件介绍

generated目录用于存储编译后的pb2文件
proto/user.proto定义的user协议
client.py模拟前后端分离向后端发起请求
server.py利用Flask创建简易web应用提供获取数据接口

依赖安装

protobuf==4.25.3
flask==3.0.2
flask-cors==4.0.0
(base) PS ......\protobuf-demo> conda activate protobuf-demo
(protobuf-demo) ......\protobuf-demo> pip install -r .\requirements.txt

proto编译

(protobuf-demo) PS D:\workspace\projects-py\protobuf-demo> protoc -I=proto --python_out=generated proto/user.proto

 执行代码后将会在generated目录中生成user.proto对应的pb2文件

文件拆解

proto/user.proto

syntax = "proto3";package user;message User {int32 id = 1;string name = 2;string email = 3;Role role = 4;enum Role {GUEST = 0;USER = 1;ADMIN = 2;}
}message UserRequest {int32 user_id = 1;}message UserResponse {User user = 1;}message UserListResponse {repeated User users = 1;}

user_pb2.py

import requestsfrom generated import user_pb2def get_user(user_id, sub_type='json'):print(f"Getting user {user_id} in {sub_type} format......")response = requests.get(url=f"http://localhost:5000/api/users/{user_id}",headers={'Accept': f'application/{sub_type}'})if response.status_code == 200:if sub_type == 'json':print(response.json())if sub_type == 'protobuf':# 反序列化user_response = user_pb2.UserResponse()user_response.ParseFromString(response.content)user = user_response.userprint(f"ID: {user.id}\n"f"Name: {user.name}\n"f"Email: {user.email}\n"f"Role: {user_pb2.User.Role.Name(user.role)}")else:print(f"Error: {response.status_code} - {response.text}")def list_users(sub_type='json'):print(f"Listing users in {sub_type} format......")response = requests.get(url=f"http://localhost:5000/api/users",headers={'Accept': f'application/{sub_type}'})if response.status_code == 200:if sub_type == 'json':print(response.json())if sub_type == 'protobuf':# 反序列化user_list_response = user_pb2.UserListResponse()user_list_response.ParseFromString(response.content)users = user_list_response.usersfor user in users:print(f"ID: {user.id}\n"f"Name: {user.name}\n"f"Email: {user.email}\n"f"Role: {user_pb2.User.Role.Name(user.role)}")else:print(f"Error: {response.status_code} - {response.text}")if __name__ == '__main__':get_user(1, 'json')get_user(1, 'protobuf')list_users('json')list_users('protobuf')

server.py

from flask import Flask, request, Response
from flask_cors import CORSfrom generated import user_pb2app = Flask(__name__)
CORS(app)# 模拟数据库
users_db = {1: user_pb2.User(id=1, name='张三', email='zhangsan@example.com', role=user_pb2.User.Role.ADMIN),2: user_pb2.User(id=2, name='李四', email='lisi@example.com', role=user_pb2.User.Role.USER),3: user_pb2.User(id=3, name='王五', email='wangwu@example.com', role=user_pb2.User.Role.GUEST),
}@app.route('/api/users/<int:user_id>', methods=['GET'])
def get_user(user_id):# 检查客户端接受的Content-typeaccept_header = request.headers.get('Accept', '')if user_id in users_db:user = users_db[user_id]# 确认返回数据格式if 'application/protobuf' in accept_header:# 返回protobuf格式response = user_pb2.UserResponse()response.user.CopyFrom(user)# 序列化返回return Response(response.SerializeToString(), content_type='application/protobuf')else:# 默认返回JSON格式return {'id': user.id,'name': user.name,'email': user.email,'role': user_pb2.User.Role.Name(user.role),}else:return {'error': 'User not found'}, 404@app.route('/api/users', methods=['GET'])
def list_users():# 检查客户端接受的Content-typeaccept_header = request.headers.get('Accept', '')if 'application/protobuf' in accept_header:# 返回protobuf格式response = user_pb2.UserListResponse()for user in users_db.values():response.users.append(user)# 序列化返回return Response(response.SerializeToString(), content_type='application/protobuf')else:# 默认返回JSON格式return [{'id': user.id,'name': user.name,'email': user.email,'role': user_pb2.User.Role.Name(user.role),}for user in users_db.values()]if __name__ == '__main__':app.run(debug=True, port=5000)

client.py

import requestsfrom generated import user_pb2def get_user(user_id, sub_type='json'):print(f"Getting user {user_id} in {sub_type} format......")response = requests.get(url=f"http://localhost:5000/api/users/{user_id}",headers={'Accept': f'application/{sub_type}'})if response.status_code == 200:if sub_type == 'json':print(response.json())if sub_type == 'protobuf':# 反序列化user_response = user_pb2.UserResponse()user_response.ParseFromString(response.content)user = user_response.userprint(f"ID: {user.id}\n"f"Name: {user.name}\n"f"Email: {user.email}\n"f"Role: {user_pb2.User.Role.Name(user.role)}")else:print(f"Error: {response.status_code} - {response.text}")def list_users(sub_type='json'):print(f"Listing users in {sub_type} format......")response = requests.get(url=f"http://localhost:5000/api/users",headers={'Accept': f'application/{sub_type}'})if response.status_code == 200:if sub_type == 'json':print(response.json())if sub_type == 'protobuf':# 反序列化user_list_response = user_pb2.UserListResponse()user_list_response.ParseFromString(response.content)users = user_list_response.usersfor user in users:print(f"ID: {user.id}\n"f"Name: {user.name}\n"f"Email: {user.email}\n"f"Role: {user_pb2.User.Role.Name(user.role)}")else:print(f"Error: {response.status_code} - {response.text}")if __name__ == '__main__':get_user(1, 'json')get_user(1, 'protobuf')list_users('json')list_users('protobuf')

环境启动 

启动服务端

(protobuf-demo) PS D:\workspace\projects-py\protobuf-demo> python .\server.py

启动客户端 

(protobuf-demo) PS D:\workspace\projects-py\protobuf-demo> python .\client.py

结果输出如下

Getting user 1 in json format......
{'email': 'zhangsan@example.com', 'id': 1, 'name': '张三', 'role': 'ADMIN'}
Getting user 1 in protobuf format......
ID: 1
Name: 张三
Email: zhangsan@example.com
Role: ADMIN
Listing users in json format......
[{'email': 'zhangsan@example.com', 'id': 1, 'name': '张三', 'role': 'ADMIN'}, {'email': 'lisi@example.com', 'id': 2, 'name': '李四', 'role': 'USER'}, {'email': 'wangwu@example.com', 'id': 3, 'name': '王五', 'role': 'GUEST'}]
Listing users in protobuf format......
ID: 1
Name: 张三
Email: zhangsan@example.com
Role: ADMIN
ID: 2
Name: 李四
Email: lisi@example.com
Role: USER
ID: 3
Name: 王五
Email: wangwu@example.com
Role: GUEST

总结

  1. protobuf 定义.proto 文件定义了数据结构,这是跨语言通信的基础

  2. 代码生成protoc 工具根据 .proto 文件生成各语言的代码

  3. 序列化/反序列化:使用 SerializeToString() 和 ParseFromString() 方法

  4. 内容协商:通过 HTTP 的 Accept 头决定返回 JSON 还是 protobuf 格式

  5. 类型安全:protobuf 提供了强类型检查,减少了运行时错误

http://www.dtcms.com/wzjs/164631.html

相关文章:

  • 阜宁县网站建设搜索引擎优化宝典
  • 建站快车源码互联网推广有哪些方式
  • 网站建设哪家公司靠谱企业网站建设原则是
  • 采集做网站百度网盘人工客服电话多少
  • c2c网站建设方案苏州网站建设书生商友
  • 做网站电商云数据库有用吗怎样做产品推广
  • .net开发的网站 能做成app吗今天北京发生大事了
  • 思科中国网站开发案例今日国内重大新闻事件
  • 辽宁建设网站做做网站
  • 广州番禺网站制作公司企业网站怎么推广
  • 哈尔滨快速建站点击查看2020做seo还有出路吗
  • 广东上海专业网站建设公司哪家好佛山网络推广哪里好
  • 做网站收费 优帮云搜索引擎大全
  • 网站建设的卷子360网站收录
  • 海南省做购房合同网站百度网址大全官网旧版
  • 清华大学精品课程网站怎么申请自己的域名
  • 苹果销售网站怎么做百度搜索推广方案
  • 中企动力做网站靠谱吗怎样宣传网站
  • 网站推广的基本手段网站交换链接友情链接的作用
  • 高端个性化网站建设产品软文范例500字
  • 有了代码如何建设网站危机公关
  • 政府网站建设分析燕郊今日头条
  • 受欢迎的医疗网站建设厦门网络关键词排名
  • 手机网站 兼容网站seo批量查询工具
  • 不会代码怎么做外贸网站深圳网络品牌推广公司
  • 乡镇网站建设抖音推广引流
  • 网站建设会议报道做seo前景怎么样
  • 怎么创立网站 优帮云sq网站推广
  • 萍乡网站推广建立网站需要什么技术
  • 唐山做网站公司永州网站seo