python grpc状态码用法

测试代码

  • 新建demo.proto文件定义协议缓冲区,写入以下内容:
syntax = "proto3";
package server;

service Demo {
  rpc ping(Request) returns (Response) {}
}

message Request {string msg = 1;}
message Response {string msg = 1;}

使用gRPC的工具包,生成gRPC服务类

python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=.  demo.proto

可以看到生成了两个文件
在这里插入图片描述

  • server.py
import grpc
import demo_pb2
import demo_pb2_grpc
from concurrent import futures


class UserInfo(demo_pb2_grpc.DemoServicer):
    def ping(self, request, context):
    	# context.set_code(grpc.StatusCode.NOT_FOUND)
        # context.set_details('测试修改')
        return demo_pb2.Response(msg='PONG')


def serve():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    demo_pb2_grpc.add_DemoServicer_to_server(UserInfo(), server)
    server.add_insecure_port('[::]:50051')
    server.start()
    server.wait_for_termination()


if __name__ == '__main__':
    serve()

  • client.py
from __future__ import print_function

import logging, sys

import grpc
import demo_pb2
import demo_pb2_grpc


def run():
    with grpc.insecure_channel('localhost:50051') as channel:
        response = demo_pb2_grpc.DemoStub(channel).ping(demo_pb2.Request())
        print(response)


if __name__ == '__main__':
    logging.basicConfig()
    run()

完整的项目结构如下:
在这里插入图片描述

状态码说明

OK 不是错误;是成功的响应。
CANCELLED 操作已取消,通常由调用方取消。
UNKNOWN 未知错误。
INVALID_ARGUMENT 客户端指定了无效参数。
DEADLINE_EXCEEDED 操作完成前的截止日期已过期。
NOT_FOUND 未找到某些请求的实体,如:文件或目录。
ALREADY_EXISTS 我们试图创建的某些实体,例如:文件或目录已经存在。
PERMISSION_DENIED 调用方无权执行指定的活动。
UNAUTHENTICATED 请求没有有效的身份验证凭据活动。
RESOURCE_EXHAUSTED 某些资源已耗尽,可能是每个用户的配额或者可能整个文件系统的空间不足。
FAILED_PRECONDITION 操作被拒绝,因为系统未处于状态操作执行所需的。
ABORTED 操作中止,通常是由于并发问题,如sequencer检查失败、事务中止等。
UNIMPLEMENTED 此服务中未实现或不支持的操作。
INTERNAL 表示底层用户期望的一些不变量系统被破坏了。
UNAVAILABLE 该服务当前不可用。
DATA_LOSS 无法恢复的数据丢失或损坏。

状态码设置状态码

修改响应状态码可通过服务端context对象修改

def ping(self, request, context):
    context.set_code(grpc.StatusCode.NOT_FOUND)
    context.set_details('测试修改')
    return demo_pb2.Response(msg='PONG')

修改前
在这里插入图片描述
修改后
在这里插入图片描述

客户端获取状态码

如果服务端报错,可以看到客户端打印输出下面内容
在这里插入图片描述
如果想要获取状态码和报错信息,我们可以捕获错误,客户端代码修改如下:

def run():
    with grpc.insecure_channel('localhost:50051') as channel:
        try:
            response = demo_pb2_grpc.DemoStub(channel).ping(demo_pb2.Request())
            print(response)
        except Exception as e:
            print()
            print(e.code())
            print(e.details())
            print(e.debug_error_string())

运行后输出如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值