Python构建嵌套Protobuf字典Payload遇Grpc报错,求解决方案
解决嵌套Protobuf结构的Payload构造问题
问题根源
你错误地将消息类型名(MyAppSettings)作为了ClusterTemplate的字段键,但实际上Protobuf生成的Python类中,字段名对应你在.proto文件里定义的字段标识名(比如proto里的my_app_settings,生成后还是下划线格式),而非消息类型的名称。
先明确你的Protobuf定义(模拟)
假设你的.proto结构如下:
syntax = "proto3"; message UpdateClusterRequest { ClusterTemplate spec = 1; } message ClusterTemplate { MyAppSettings my_app_settings = 1; // 注意这里的字段名是my_app_settings DbSettings db_settings = 2; // 字段名是db_settings } message MyAppSettings { string app_name = 1; int32 port = 2; } message DbSettings { string db_host = 1; string db_name = 2; }
正确的Payload构造方式
构造字典时,每个层级都要对应.proto里定义的字段名,而非消息类型名:
# 正确的Payload字典 payload = { "spec": { "my_app_settings": { "app_name": "test-app", "port": 8080 }, "db_settings": { "db_host": "127.0.0.1", "db_name": "cluster_db" } } } # 生成gRPC请求对象 from your_proto_generated_pb2 import UpdateClusterRequest request = UpdateClusterRequest(**payload)
额外注意事项
- 可以直接查看Protobuf生成的Python文件(比如
xxx_pb2.py),找到ClusterTemplate类的字段定义,确认正确的字段名 - 所有嵌套层级都遵循这个规则:用字段名而非消息类型名作为字典键
内容的提问来源于stack exchange,提问作者New2Python
相关产品推荐
相关产品推荐

