Я строю клиент / сервер хранения файлов, используя python для клиента, иди на сервер вместе с gRPC. Я уже успешно построил клиент в Go, и он работает! Я пытаюсь сделать то же самое в Python сейчас. Сегодня я работал над этим весь день, но у меня 0 успехов -_-. Запрос, который я отправляю на мой сервер, вероятно, каким-то образом некорректен, судя по тому, что сообщение об ошибке выпало из библиотеки gRPC:
File "/Users/xxxxx/Desktop/clients/uploadClient.py", line 60, in upload_file
for res in stream:
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/grpc/_channel.py", line 367, in __next__
return self._next()
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/grpc/_channel.py", line 361, in _next
raise self
grpc._channel._Rendezvous: <_Rendezvous of RPC that terminated with:
status = StatusCode.INTERNAL
details = "Exception serializing request!"
debug_error_string = "None"
>
Не слишком полезно. Я не нашел никакой полезной документации, и часы чтения и поиска еще не окупились. Единственное, что я могу исключить, так это то, что проблема связана с сервером, так как клиент go работал отлично.
Вот мой прото (примечание: я немного отогнал это и переименовал некоторые вещи):
syntax = "proto3";
import "google/protobuf/timestamp.proto";
package upload;
message Chunk {
message Index {
uint64 as_uint64 = 1;
}
Index index = 1;
bytes sha512 = 2;
bytes data = 3;
}
message Descriptor {
string author = 1; // author
string label = 2; // label
Format format = 3; //format
}
enum Format {
FORMAT_UNKNOWN = 0;
FORMAT_CSV = 1;
FORMAT_XML = 2;
FORMAT_JSON = 3;
FORMAT_PDF = 4;
}
message UploadFile {
message ToClient {
oneof details {
Finished finished = 1;
}
}
message ToService {
oneof details {
Descriptor descriptor = 1;
Chunk chunk = 2;
}
}
}
.
service FileService {
rpc Upload(stream UploadFile.ToService) returns (stream UploadFile.ToClient);
}
Вот код (примечание: я немного отогнал это и переименовал некоторые вещи):
import s_pb2 as s
import s_pb2_grpc as s_grpc
token = 'xxxx'
url = 'xxxx:433'
requestMetadata = [('authorization', 'Bearer ' + token)]
def create_stub():
creds = grpc.ssl_channel_credentials()
channel = grpc.secure_channel(url, creds)
return s_grpc.UploadManagerStub(channel)
def upload_file(src, label, fileFormat):
stub = create_stub()
stream = stub.Upload(
request_iterator=__upload_file_iterator(src, label, fileFormat),
metadata=requestMetadata
)
for res in stream:
print(res)
return stream
def __upload_file_iterator(src, name, fileFormat, chunk_size = 1024):
def descriptor():
to_service = s.UploadFile.ToService
to_service.descriptor = s.Descriptor(
label=label,
format=fileFormat
)
return to_service
yield descriptor()
Да, я знаю, что мой итератор возвращает только 1 вещь, я удалил некоторый код, чтобы попытаться изолировать проблему.
gRPC - не самые сильные мои навыки, и я хотел бы верить, что мой мозг гороха просто упускает что-то очевидное
Вся помощь приветствуется!