Думаю, вы нашли нужный компонент. HandlerCallDetails используется, чтобы позволить серверу gRP C соответствовать имени метода и обработчику.
Один из возможных способов сделать это - реализовать ServiceRpcHandler . Вы можете реализовать свой собственный обработчик и передать его серверу gRP C. В обработчике службы вы можете предоставить информацию об имени метода в качестве третьего аргумента, или присоединить ее к контексту службы, или назначить локальному хранилищу потока.
Кроме того, созданный ProtoBuf код скрывает эту деталь и это может быть хорошей справкой, чтобы увидеть, как это делается.
Вот копия кода, сгенерированного ProtoBuf:
def add_GreeterServicer_to_server(servicer, server):
rpc_method_handlers = {
'SayHello': grpc.unary_unary_rpc_method_handler(
servicer.SayHello,
request_deserializer=helloworld__pb2.HelloRequest.FromString,
response_serializer=helloworld__pb2.HelloReply.SerializeToString,
),
}
generic_handler = grpc.method_handlers_generic_handler(
'helloworld.Greeter', rpc_method_handlers)
server.add_generic_rpc_handlers((generic_handler,))
Вот сервис RP по умолчанию C обработчик реализация :
class DictionaryGenericHandler(grpc.ServiceRpcHandler):
def __init__(self, service, method_handlers):
self._name = service
self._method_handlers = {
_common.fully_qualified_method(service, method): method_handler
for method, method_handler in six.iteritems(method_handlers)
}
def service_name(self):
return self._name
def service(self, handler_call_details):
return self._method_handlers.get(handler_call_details.method)