Python gRPC ошибка: "error": "13 INTERNAL: Failed to serialize response!" при попытке вернуть повторное сообщение вместо потока в запросе списка.

У меня есть django REST API, который я пытаюсь преобразовать в gRPC. Я следовал руководству Django grpc framework guide и создал следующие файлы:

models.py
class Organization(models.Model):
    Org_name = models.CharField(max_length=100, unique=True, primary_key=True, db_index=True)
    Address = models.CharField(max_length=100)
    Description = models.CharField(max_length=500)
    Number_of_emp = models.IntegerField()
org.proto

package org;

import "google/protobuf/empty.proto";

service OrganizationController {
    rpc List(OrganizationListRequest) returns (Organizations) {}
    rpc Create(Organization) returns (Organization) {}
    rpc Retrieve(OrganizationRetrieveRequest) returns (Organization) {}
    rpc Update(Organization) returns (Organization) {}
    rpc Destroy(Organization) returns (google.protobuf.Empty) {}
}

message Organization {
    string Org_name = 1;
    string Address = 2;
    string Description = 3;
    int32 Number_of_emp = 4;
}

message OrganizationListRequest {
}

message OrganizationRetrieveRequest {
    string Org_name = 1;
}

message Organizations {
    repeated Organization organization = 1;
}

Обратите внимание, что Organizations - это сообщение, объявленное в org.proto для возврата List или массива объектов

services.py
class OrganizationService(generics.ModelService):
    queryset = Organization.objects.all()
    serializer_class = OrganizationSerializerProto
serializers.py
class OrganizationSerializerProto(proto_serializers.ModelProtoSerializer):
    class Meta:
        model = Organization
        proto_class = org_pb2.Organization
        fields = '__all__'

Проблема Я хочу сделать запрос, используя rpc List(OrganizationListRequest) returns (Organizations) {}, чтобы получить список всех организаций в базе данных. Однако, когда я делаю вызов rpc, я получаю следующую ошибку: ошибка запроса: "error": "13 INTERNAL: Failed to serialize response!" (для выполнения запроса я использую клиент BloomRPC gui)

Однако, если я изменю
rpc List(OrganizationListRequest) returns (Organizations) {} на
rpc List(OrganizationListRequest) returns (stream Organization) {}
запрос возвращается нормально, и я получаю поток ответов, содержащий все объекты. Я не хочу возвращать данные в потоке, я хочу, чтобы он возвращал массив объектов, но использование message Organizations {repeated Organization organization = 1;} вызывает вышеуказанную ошибку. Может я делаю ошибку? Я искал везде, но не смог найти эту ошибку. Или невозможно сделать такой вызов RPC?

Это ошибка протокодека на стороне сервера. Обычно это происходит из-за:

  1. Несоответствие сгенерированной библиотеки proto между клиентом и сервером;
  2. Сообщение о несоответствии типа (например, отправлено Organizations вместо Organization).

gRPC Python будет регистрировать исключение, вызывающее ошибку Failed to serialize response!. Вы можете включить протоколирование Python явно через logging.basicConfig(level=logging.INFO). Вот ссылка на строку протоколирования:

https://github.com/grpc/grpc/blob/bed585bdcb5cbbbfb407b4e869665d405b04adca/src/python/grpcio/grpc/_common.py#L88

Если после вышеуказанного исследования ошибка все еще сохраняется, можете ли вы создать воспроизводимый случай и отправить по адресу https://github.com/grpc/grpc/issues?

Вернуться на верх