Working on a python example plus fixing python grpc code (#6456)

Refactored python grpc code gen

Adds example server & client + fixes ci

Fixes generated code

Making sure we encode the reply string as utf8

Adds Readme details to clarify issue regarding encoding when python is sending/receiving
This commit is contained in:
mustiikhalil
2021-02-26 01:38:12 +03:00
committed by GitHub
parent c0be1cb7a5
commit 8142fedd19
15 changed files with 443 additions and 692 deletions

View File

@@ -0,0 +1,12 @@
# Python Greeter example
## Prerequisite
- You need to have grpc python installed on your device `pip install grpcio`
## How to run Server:
- `python server.py ${PORT}`
## How to run Client:
- `python client.py ${PORT} ${NAME}`

View File

@@ -0,0 +1,40 @@
import sys
import argparse
import grpc
sys.path.insert(0, '../../../../../flatbuffers/python')
import flatbuffers
from models import HelloReply, HelloRequest, greeter_grpc_fb
parser = argparse.ArgumentParser()
parser.add_argument("port", help="server port to connect to", default=3000)
parser.add_argument("name", help="name to be sent to server", default="flatbuffers")
def say_hello(stub, hello_request):
reply = stub.SayHello(hello_request)
r = HelloReply.HelloReply.GetRootAs(reply)
print(r.Message())
def say_many_hellos(stub, hello_request):
greetings = stub.SayManyHellos(hello_request)
for greeting in greetings:
r = HelloReply.HelloReply.GetRootAs(greeting)
print(r.Message())
def main():
args = parser.parse_args()
with grpc.insecure_channel('localhost:' + args.port) as channel:
builder = flatbuffers.Builder()
ind = builder.CreateString(args.name)
HelloRequest.HelloRequestStart(builder)
HelloRequest.HelloRequestAddName(builder, ind)
root = HelloRequest.HelloRequestEnd(builder)
builder.Finish(root)
output = bytes(builder.Output())
stub = greeter_grpc_fb.GreeterStub(channel)
say_hello(stub, output)
say_many_hellos(stub, output)
main()

View File

@@ -0,0 +1,45 @@
# automatically generated by the FlatBuffers compiler, do not modify
# namespace: models
import flatbuffers
from flatbuffers.compat import import_numpy
np = import_numpy()
class HelloReply(object):
__slots__ = ['_tab']
@classmethod
def GetRootAs(cls, buf, offset=0):
n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)
x = HelloReply()
x.Init(buf, n + offset)
return x
@classmethod
def GetRootAsHelloReply(cls, buf, offset=0):
"""This method is deprecated. Please switch to GetRootAs."""
return cls.GetRootAs(buf, offset)
# HelloReply
def Init(self, buf, pos):
self._tab = flatbuffers.table.Table(buf, pos)
# HelloReply
def Message(self):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))
if o != 0:
return self._tab.String(o + self._tab.Pos)
return None
def Start(builder): builder.StartObject(1)
def HelloReplyStart(builder):
"""This method is deprecated. Please switch to Start."""
return Start(builder)
def AddMessage(builder, message): builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(message), 0)
def HelloReplyAddMessage(builder, message):
"""This method is deprecated. Please switch to AddMessage."""
return AddMessage(builder, message)
def End(builder): return builder.EndObject()
def HelloReplyEnd(builder):
"""This method is deprecated. Please switch to End."""
return End(builder)

View File

@@ -0,0 +1,45 @@
# automatically generated by the FlatBuffers compiler, do not modify
# namespace: models
import flatbuffers
from flatbuffers.compat import import_numpy
np = import_numpy()
class HelloRequest(object):
__slots__ = ['_tab']
@classmethod
def GetRootAs(cls, buf, offset=0):
n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)
x = HelloRequest()
x.Init(buf, n + offset)
return x
@classmethod
def GetRootAsHelloRequest(cls, buf, offset=0):
"""This method is deprecated. Please switch to GetRootAs."""
return cls.GetRootAs(buf, offset)
# HelloRequest
def Init(self, buf, pos):
self._tab = flatbuffers.table.Table(buf, pos)
# HelloRequest
def Name(self):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))
if o != 0:
return self._tab.String(o + self._tab.Pos)
return None
def Start(builder): builder.StartObject(1)
def HelloRequestStart(builder):
"""This method is deprecated. Please switch to Start."""
return Start(builder)
def AddName(builder, name): builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(name), 0)
def HelloRequestAddName(builder, name):
"""This method is deprecated. Please switch to AddName."""
return AddName(builder, name)
def End(builder): return builder.EndObject()
def HelloRequestEnd(builder):
"""This method is deprecated. Please switch to End."""
return End(builder)

View File

@@ -0,0 +1,52 @@
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
import grpc
class GreeterStub(object):
""" Interface exported by the server. """
def __init__(self, channel):
""" Constructor.
Args:
channel: A grpc.Channel.
"""
self.SayHello = channel.unary_unary(
"/models.Greeter/SayHello"
)
self.SayManyHellos = channel.unary_stream(
"/models.Greeter/SayManyHellos"
)
class GreeterServicer(object):
""" Interface exported by the server. """
def SayHello(self, request, context):
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def SayManyHellos(self, request, context):
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def add_GreeterServicer_to_server(servicer, server):
rpc_method_handlers = {
'SayHello': grpc.unary_unary_rpc_method_handler(
servicer.SayHello
),
'SayManyHellos': grpc.unary_stream_rpc_method_handler(
servicer.SayManyHellos
),
}
generic_handler = grpc.method_handlers_generic_handler(
'models.Greeter', rpc_method_handlers)
server.add_generic_rpc_handlers((generic_handler,))

View File

@@ -0,0 +1,57 @@
from concurrent import futures
import sys
import argparse
import grpc
sys.path.insert(0, '../../../../../flatbuffers/python')
import flatbuffers
from models import HelloReply, HelloRequest, greeter_grpc_fb
parser = argparse.ArgumentParser()
parser.add_argument("port", help="server on port", default=3000)
def build_reply(message):
builder = flatbuffers.Builder()
ind = builder.CreateString(message)
HelloReply.HelloReplyStart(builder)
HelloReply.HelloReplyAddMessage(builder, ind)
root = HelloReply.HelloReplyEnd(builder)
builder.Finish(root)
return bytes(builder.Output())
class GreeterServicer(greeter_grpc_fb.GreeterServicer):
def __init__(self):
self.greetings = ["Hi", "Hallo", "Ciao"]
def SayHello(self, request, context):
r = HelloRequest.HelloRequest().GetRootAs(request, 0)
reply = "Unknown"
if r.Name():
reply = r.Name()
return build_reply("welcome " + reply.decode('UTF-8'))
def SayManyHellos(self, request, context):
r = HelloRequest.HelloRequest().GetRootAs(request, 0)
reply = "Unknown"
if r.Name():
reply = r.Name()
for greeting in self.greetings:
print(type(reply))
yield build_reply(greeting + " " + reply.decode('UTF-8'))
def serve():
args = parser.parse_args()
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
greeter_grpc_fb.add_GreeterServicer_to_server(
GreeterServicer(), server
)
server.add_insecure_port('[::]:' + args.port)
server.start()
server.wait_for_termination()
if __name__ == '__main__':
serve()