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?
Это ошибка протокодека на стороне сервера. Обычно это происходит из-за:
- Несоответствие сгенерированной библиотеки proto между клиентом и сервером;
- Сообщение о несоответствии типа (например, отправлено
Organizations
вместоOrganization
).
gRPC Python будет регистрировать исключение, вызывающее ошибку Failed to serialize response!
. Вы можете включить протоколирование Python явно через logging.basicConfig(level=logging.INFO)
. Вот ссылка на строку протоколирования:
Если после вышеуказанного исследования ошибка все еще сохраняется, можете ли вы создать воспроизводимый случай и отправить по адресу https://github.com/grpc/grpc/issues?