first commit
This commit is contained in:
commit
c945aba23f
11
.gitignore
vendored
Normal file
11
.gitignore
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
.DS_Store
|
||||||
|
*.*~
|
||||||
|
*.py[co]
|
||||||
|
*.pid
|
||||||
|
*.log
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*~
|
||||||
|
django_cache
|
||||||
|
.idea
|
||||||
|
.cache
|
9
README
Normal file
9
README
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
This is a sample Thrift application using Python for both the server and client code.
|
||||||
|
|
||||||
|
This sample was based off the work found here http://tkang.blogspot.ca/2010/07/thrift-server-client-in-python.html then expanded upon to first make it functional out of the box(the posted version on the blog had a couple of minor bugs) and to make it a tad more complex to show off some of thrifts features better, but remain a simple application for beginers to get their feet wet with
|
||||||
|
|
||||||
|
Requirements:
|
||||||
|
|
||||||
|
Thrift
|
||||||
|
thrift (the python package)
|
||||||
|
Python (I'm using 2.7.1)
|
27
client.py
Normal file
27
client.py
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
from helloworld import HelloWorld
|
||||||
|
from helloworld.ttypes import *
|
||||||
|
from helloworld.constants import *
|
||||||
|
|
||||||
|
from thrift import Thrift
|
||||||
|
from thrift.transport import TSocket, TTransport
|
||||||
|
from thrift.protocol import TBinaryProtocol
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
transport = TSocket.TSocket('localhost', 9090)
|
||||||
|
transport = TTransport.TBufferedTransport(transport)
|
||||||
|
protocol = TBinaryProtocol.TBinaryProtocol(transport)
|
||||||
|
client = HelloWorld.Client(protocol)
|
||||||
|
|
||||||
|
transport.open()
|
||||||
|
|
||||||
|
resp = client.ping()
|
||||||
|
print resp
|
||||||
|
|
||||||
|
msg = Message(name='Ray', lang='jp')
|
||||||
|
resp = client.sayHello(msg)
|
||||||
|
print resp
|
||||||
|
|
||||||
|
transport.close()
|
||||||
|
except Thrift.TException, tx:
|
||||||
|
print tx.message
|
14
helloworld.thrift
Normal file
14
helloworld.thrift
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
const string HELLO_IN_ENGLISH = "hello!"
|
||||||
|
const string HELLO_IN_KOREAN = "an-nyoung-ha-se-yo"
|
||||||
|
const string HELLO_IN_FRENCH = "bonjour!"
|
||||||
|
const string HELLO_IN_JAPANESE = "konichiwa!"
|
||||||
|
|
||||||
|
struct Message {
|
||||||
|
1: string name,
|
||||||
|
2: optional string lang = "en"
|
||||||
|
}
|
||||||
|
|
||||||
|
service HelloWorld {
|
||||||
|
string ping(),
|
||||||
|
string sayHello(1:Message msg)
|
||||||
|
}
|
95
helloworld/HelloWorld-remote
Executable file
95
helloworld/HelloWorld-remote
Executable file
@ -0,0 +1,95 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
#
|
||||||
|
# Autogenerated by Thrift Compiler (0.8.0)
|
||||||
|
#
|
||||||
|
# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
|
||||||
|
#
|
||||||
|
# options string: py:new_style
|
||||||
|
#
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import pprint
|
||||||
|
from urlparse import urlparse
|
||||||
|
from thrift.transport import TTransport
|
||||||
|
from thrift.transport import TSocket
|
||||||
|
from thrift.transport import THttpClient
|
||||||
|
from thrift.protocol import TBinaryProtocol
|
||||||
|
|
||||||
|
import HelloWorld
|
||||||
|
from ttypes import *
|
||||||
|
|
||||||
|
if len(sys.argv) <= 1 or sys.argv[1] == '--help':
|
||||||
|
print ''
|
||||||
|
print 'Usage: ' + sys.argv[0] + ' [-h host[:port]] [-u url] [-f[ramed]] function [arg1 [arg2...]]'
|
||||||
|
print ''
|
||||||
|
print 'Functions:'
|
||||||
|
print ' string ping()'
|
||||||
|
print ' string sayHello(Message msg)'
|
||||||
|
print ''
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
pp = pprint.PrettyPrinter(indent = 2)
|
||||||
|
host = 'localhost'
|
||||||
|
port = 9090
|
||||||
|
uri = ''
|
||||||
|
framed = False
|
||||||
|
http = False
|
||||||
|
argi = 1
|
||||||
|
|
||||||
|
if sys.argv[argi] == '-h':
|
||||||
|
parts = sys.argv[argi+1].split(':')
|
||||||
|
host = parts[0]
|
||||||
|
if len(parts) > 1:
|
||||||
|
port = int(parts[1])
|
||||||
|
argi += 2
|
||||||
|
|
||||||
|
if sys.argv[argi] == '-u':
|
||||||
|
url = urlparse(sys.argv[argi+1])
|
||||||
|
parts = url[1].split(':')
|
||||||
|
host = parts[0]
|
||||||
|
if len(parts) > 1:
|
||||||
|
port = int(parts[1])
|
||||||
|
else:
|
||||||
|
port = 80
|
||||||
|
uri = url[2]
|
||||||
|
if url[4]:
|
||||||
|
uri += '?%s' % url[4]
|
||||||
|
http = True
|
||||||
|
argi += 2
|
||||||
|
|
||||||
|
if sys.argv[argi] == '-f' or sys.argv[argi] == '-framed':
|
||||||
|
framed = True
|
||||||
|
argi += 1
|
||||||
|
|
||||||
|
cmd = sys.argv[argi]
|
||||||
|
args = sys.argv[argi+1:]
|
||||||
|
|
||||||
|
if http:
|
||||||
|
transport = THttpClient.THttpClient(host, port, uri)
|
||||||
|
else:
|
||||||
|
socket = TSocket.TSocket(host, port)
|
||||||
|
if framed:
|
||||||
|
transport = TTransport.TFramedTransport(socket)
|
||||||
|
else:
|
||||||
|
transport = TTransport.TBufferedTransport(socket)
|
||||||
|
protocol = TBinaryProtocol.TBinaryProtocol(transport)
|
||||||
|
client = HelloWorld.Client(protocol)
|
||||||
|
transport.open()
|
||||||
|
|
||||||
|
if cmd == 'ping':
|
||||||
|
if len(args) != 0:
|
||||||
|
print 'ping requires 0 args'
|
||||||
|
sys.exit(1)
|
||||||
|
pp.pprint(client.ping())
|
||||||
|
|
||||||
|
elif cmd == 'sayHello':
|
||||||
|
if len(args) != 1:
|
||||||
|
print 'sayHello requires 1 args'
|
||||||
|
sys.exit(1)
|
||||||
|
pp.pprint(client.sayHello(eval(args[0]),))
|
||||||
|
|
||||||
|
else:
|
||||||
|
print 'Unrecognized method %s' % cmd
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
transport.close()
|
361
helloworld/HelloWorld.py
Normal file
361
helloworld/HelloWorld.py
Normal file
@ -0,0 +1,361 @@
|
|||||||
|
#
|
||||||
|
# Autogenerated by Thrift Compiler (0.8.0)
|
||||||
|
#
|
||||||
|
# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
|
||||||
|
#
|
||||||
|
# options string: py:new_style
|
||||||
|
#
|
||||||
|
|
||||||
|
from thrift.Thrift import TType, TMessageType, TException
|
||||||
|
from ttypes import *
|
||||||
|
from thrift.Thrift import TProcessor
|
||||||
|
from thrift.transport import TTransport
|
||||||
|
from thrift.protocol import TBinaryProtocol, TProtocol
|
||||||
|
try:
|
||||||
|
from thrift.protocol import fastbinary
|
||||||
|
except:
|
||||||
|
fastbinary = None
|
||||||
|
|
||||||
|
|
||||||
|
class Iface(object):
|
||||||
|
def ping(self, ):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def sayHello(self, msg):
|
||||||
|
"""
|
||||||
|
Parameters:
|
||||||
|
- msg
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class Client(Iface):
|
||||||
|
def __init__(self, iprot, oprot=None):
|
||||||
|
self._iprot = self._oprot = iprot
|
||||||
|
if oprot is not None:
|
||||||
|
self._oprot = oprot
|
||||||
|
self._seqid = 0
|
||||||
|
|
||||||
|
def ping(self, ):
|
||||||
|
self.send_ping()
|
||||||
|
return self.recv_ping()
|
||||||
|
|
||||||
|
def send_ping(self, ):
|
||||||
|
self._oprot.writeMessageBegin('ping', TMessageType.CALL, self._seqid)
|
||||||
|
args = ping_args()
|
||||||
|
args.write(self._oprot)
|
||||||
|
self._oprot.writeMessageEnd()
|
||||||
|
self._oprot.trans.flush()
|
||||||
|
|
||||||
|
def recv_ping(self, ):
|
||||||
|
(fname, mtype, rseqid) = self._iprot.readMessageBegin()
|
||||||
|
if mtype == TMessageType.EXCEPTION:
|
||||||
|
x = TApplicationException()
|
||||||
|
x.read(self._iprot)
|
||||||
|
self._iprot.readMessageEnd()
|
||||||
|
raise x
|
||||||
|
result = ping_result()
|
||||||
|
result.read(self._iprot)
|
||||||
|
self._iprot.readMessageEnd()
|
||||||
|
if result.success is not None:
|
||||||
|
return result.success
|
||||||
|
raise TApplicationException(TApplicationException.MISSING_RESULT, "ping failed: unknown result");
|
||||||
|
|
||||||
|
def sayHello(self, msg):
|
||||||
|
"""
|
||||||
|
Parameters:
|
||||||
|
- msg
|
||||||
|
"""
|
||||||
|
self.send_sayHello(msg)
|
||||||
|
return self.recv_sayHello()
|
||||||
|
|
||||||
|
def send_sayHello(self, msg):
|
||||||
|
self._oprot.writeMessageBegin('sayHello', TMessageType.CALL, self._seqid)
|
||||||
|
args = sayHello_args()
|
||||||
|
args.msg = msg
|
||||||
|
args.write(self._oprot)
|
||||||
|
self._oprot.writeMessageEnd()
|
||||||
|
self._oprot.trans.flush()
|
||||||
|
|
||||||
|
def recv_sayHello(self, ):
|
||||||
|
(fname, mtype, rseqid) = self._iprot.readMessageBegin()
|
||||||
|
if mtype == TMessageType.EXCEPTION:
|
||||||
|
x = TApplicationException()
|
||||||
|
x.read(self._iprot)
|
||||||
|
self._iprot.readMessageEnd()
|
||||||
|
raise x
|
||||||
|
result = sayHello_result()
|
||||||
|
result.read(self._iprot)
|
||||||
|
self._iprot.readMessageEnd()
|
||||||
|
if result.success is not None:
|
||||||
|
return result.success
|
||||||
|
raise TApplicationException(TApplicationException.MISSING_RESULT, "sayHello failed: unknown result");
|
||||||
|
|
||||||
|
|
||||||
|
class Processor(Iface, TProcessor):
|
||||||
|
def __init__(self, handler):
|
||||||
|
self._handler = handler
|
||||||
|
self._processMap = {}
|
||||||
|
self._processMap["ping"] = Processor.process_ping
|
||||||
|
self._processMap["sayHello"] = Processor.process_sayHello
|
||||||
|
|
||||||
|
def process(self, iprot, oprot):
|
||||||
|
(name, type, seqid) = iprot.readMessageBegin()
|
||||||
|
if name not in self._processMap:
|
||||||
|
iprot.skip(TType.STRUCT)
|
||||||
|
iprot.readMessageEnd()
|
||||||
|
x = TApplicationException(TApplicationException.UNKNOWN_METHOD, 'Unknown function %s' % (name))
|
||||||
|
oprot.writeMessageBegin(name, TMessageType.EXCEPTION, seqid)
|
||||||
|
x.write(oprot)
|
||||||
|
oprot.writeMessageEnd()
|
||||||
|
oprot.trans.flush()
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
self._processMap[name](self, seqid, iprot, oprot)
|
||||||
|
return True
|
||||||
|
|
||||||
|
def process_ping(self, seqid, iprot, oprot):
|
||||||
|
args = ping_args()
|
||||||
|
args.read(iprot)
|
||||||
|
iprot.readMessageEnd()
|
||||||
|
result = ping_result()
|
||||||
|
result.success = self._handler.ping()
|
||||||
|
oprot.writeMessageBegin("ping", TMessageType.REPLY, seqid)
|
||||||
|
result.write(oprot)
|
||||||
|
oprot.writeMessageEnd()
|
||||||
|
oprot.trans.flush()
|
||||||
|
|
||||||
|
def process_sayHello(self, seqid, iprot, oprot):
|
||||||
|
args = sayHello_args()
|
||||||
|
args.read(iprot)
|
||||||
|
iprot.readMessageEnd()
|
||||||
|
result = sayHello_result()
|
||||||
|
result.success = self._handler.sayHello(args.msg)
|
||||||
|
oprot.writeMessageBegin("sayHello", TMessageType.REPLY, seqid)
|
||||||
|
result.write(oprot)
|
||||||
|
oprot.writeMessageEnd()
|
||||||
|
oprot.trans.flush()
|
||||||
|
|
||||||
|
|
||||||
|
# HELPER FUNCTIONS AND STRUCTURES
|
||||||
|
|
||||||
|
class ping_args(object):
|
||||||
|
|
||||||
|
thrift_spec = (
|
||||||
|
)
|
||||||
|
|
||||||
|
def read(self, iprot):
|
||||||
|
if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
|
||||||
|
fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
|
||||||
|
return
|
||||||
|
iprot.readStructBegin()
|
||||||
|
while True:
|
||||||
|
(fname, ftype, fid) = iprot.readFieldBegin()
|
||||||
|
if ftype == TType.STOP:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
iprot.skip(ftype)
|
||||||
|
iprot.readFieldEnd()
|
||||||
|
iprot.readStructEnd()
|
||||||
|
|
||||||
|
def write(self, oprot):
|
||||||
|
if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
|
||||||
|
oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
|
||||||
|
return
|
||||||
|
oprot.writeStructBegin('ping_args')
|
||||||
|
oprot.writeFieldStop()
|
||||||
|
oprot.writeStructEnd()
|
||||||
|
|
||||||
|
def validate(self):
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
L = ['%s=%r' % (key, value)
|
||||||
|
for key, value in self.__dict__.iteritems()]
|
||||||
|
return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
|
||||||
|
|
||||||
|
def __ne__(self, other):
|
||||||
|
return not (self == other)
|
||||||
|
|
||||||
|
class ping_result(object):
|
||||||
|
"""
|
||||||
|
Attributes:
|
||||||
|
- success
|
||||||
|
"""
|
||||||
|
|
||||||
|
thrift_spec = (
|
||||||
|
(0, TType.STRING, 'success', None, None, ), # 0
|
||||||
|
)
|
||||||
|
|
||||||
|
def __init__(self, success=None,):
|
||||||
|
self.success = success
|
||||||
|
|
||||||
|
def read(self, iprot):
|
||||||
|
if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
|
||||||
|
fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
|
||||||
|
return
|
||||||
|
iprot.readStructBegin()
|
||||||
|
while True:
|
||||||
|
(fname, ftype, fid) = iprot.readFieldBegin()
|
||||||
|
if ftype == TType.STOP:
|
||||||
|
break
|
||||||
|
if fid == 0:
|
||||||
|
if ftype == TType.STRING:
|
||||||
|
self.success = iprot.readString();
|
||||||
|
else:
|
||||||
|
iprot.skip(ftype)
|
||||||
|
else:
|
||||||
|
iprot.skip(ftype)
|
||||||
|
iprot.readFieldEnd()
|
||||||
|
iprot.readStructEnd()
|
||||||
|
|
||||||
|
def write(self, oprot):
|
||||||
|
if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
|
||||||
|
oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
|
||||||
|
return
|
||||||
|
oprot.writeStructBegin('ping_result')
|
||||||
|
if self.success is not None:
|
||||||
|
oprot.writeFieldBegin('success', TType.STRING, 0)
|
||||||
|
oprot.writeString(self.success)
|
||||||
|
oprot.writeFieldEnd()
|
||||||
|
oprot.writeFieldStop()
|
||||||
|
oprot.writeStructEnd()
|
||||||
|
|
||||||
|
def validate(self):
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
L = ['%s=%r' % (key, value)
|
||||||
|
for key, value in self.__dict__.iteritems()]
|
||||||
|
return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
|
||||||
|
|
||||||
|
def __ne__(self, other):
|
||||||
|
return not (self == other)
|
||||||
|
|
||||||
|
class sayHello_args(object):
|
||||||
|
"""
|
||||||
|
Attributes:
|
||||||
|
- msg
|
||||||
|
"""
|
||||||
|
|
||||||
|
thrift_spec = (
|
||||||
|
None, # 0
|
||||||
|
(1, TType.STRUCT, 'msg', (Message, Message.thrift_spec), None, ), # 1
|
||||||
|
)
|
||||||
|
|
||||||
|
def __init__(self, msg=None,):
|
||||||
|
self.msg = msg
|
||||||
|
|
||||||
|
def read(self, iprot):
|
||||||
|
if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
|
||||||
|
fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
|
||||||
|
return
|
||||||
|
iprot.readStructBegin()
|
||||||
|
while True:
|
||||||
|
(fname, ftype, fid) = iprot.readFieldBegin()
|
||||||
|
if ftype == TType.STOP:
|
||||||
|
break
|
||||||
|
if fid == 1:
|
||||||
|
if ftype == TType.STRUCT:
|
||||||
|
self.msg = Message()
|
||||||
|
self.msg.read(iprot)
|
||||||
|
else:
|
||||||
|
iprot.skip(ftype)
|
||||||
|
else:
|
||||||
|
iprot.skip(ftype)
|
||||||
|
iprot.readFieldEnd()
|
||||||
|
iprot.readStructEnd()
|
||||||
|
|
||||||
|
def write(self, oprot):
|
||||||
|
if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
|
||||||
|
oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
|
||||||
|
return
|
||||||
|
oprot.writeStructBegin('sayHello_args')
|
||||||
|
if self.msg is not None:
|
||||||
|
oprot.writeFieldBegin('msg', TType.STRUCT, 1)
|
||||||
|
self.msg.write(oprot)
|
||||||
|
oprot.writeFieldEnd()
|
||||||
|
oprot.writeFieldStop()
|
||||||
|
oprot.writeStructEnd()
|
||||||
|
|
||||||
|
def validate(self):
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
L = ['%s=%r' % (key, value)
|
||||||
|
for key, value in self.__dict__.iteritems()]
|
||||||
|
return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
|
||||||
|
|
||||||
|
def __ne__(self, other):
|
||||||
|
return not (self == other)
|
||||||
|
|
||||||
|
class sayHello_result(object):
|
||||||
|
"""
|
||||||
|
Attributes:
|
||||||
|
- success
|
||||||
|
"""
|
||||||
|
|
||||||
|
thrift_spec = (
|
||||||
|
(0, TType.STRING, 'success', None, None, ), # 0
|
||||||
|
)
|
||||||
|
|
||||||
|
def __init__(self, success=None,):
|
||||||
|
self.success = success
|
||||||
|
|
||||||
|
def read(self, iprot):
|
||||||
|
if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
|
||||||
|
fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
|
||||||
|
return
|
||||||
|
iprot.readStructBegin()
|
||||||
|
while True:
|
||||||
|
(fname, ftype, fid) = iprot.readFieldBegin()
|
||||||
|
if ftype == TType.STOP:
|
||||||
|
break
|
||||||
|
if fid == 0:
|
||||||
|
if ftype == TType.STRING:
|
||||||
|
self.success = iprot.readString();
|
||||||
|
else:
|
||||||
|
iprot.skip(ftype)
|
||||||
|
else:
|
||||||
|
iprot.skip(ftype)
|
||||||
|
iprot.readFieldEnd()
|
||||||
|
iprot.readStructEnd()
|
||||||
|
|
||||||
|
def write(self, oprot):
|
||||||
|
if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
|
||||||
|
oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
|
||||||
|
return
|
||||||
|
oprot.writeStructBegin('sayHello_result')
|
||||||
|
if self.success is not None:
|
||||||
|
oprot.writeFieldBegin('success', TType.STRING, 0)
|
||||||
|
oprot.writeString(self.success)
|
||||||
|
oprot.writeFieldEnd()
|
||||||
|
oprot.writeFieldStop()
|
||||||
|
oprot.writeStructEnd()
|
||||||
|
|
||||||
|
def validate(self):
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
L = ['%s=%r' % (key, value)
|
||||||
|
for key, value in self.__dict__.iteritems()]
|
||||||
|
return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
|
||||||
|
|
||||||
|
def __ne__(self, other):
|
||||||
|
return not (self == other)
|
1
helloworld/__init__.py
Normal file
1
helloworld/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
__all__ = ['ttypes', 'constants', 'HelloWorld']
|
15
helloworld/constants.py
Normal file
15
helloworld/constants.py
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#
|
||||||
|
# Autogenerated by Thrift Compiler (0.8.0)
|
||||||
|
#
|
||||||
|
# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
|
||||||
|
#
|
||||||
|
# options string: py:new_style
|
||||||
|
#
|
||||||
|
|
||||||
|
from thrift.Thrift import TType, TMessageType, TException
|
||||||
|
from ttypes import *
|
||||||
|
|
||||||
|
HELLO_IN_ENGLISH = "hello!"
|
||||||
|
HELLO_IN_KOREAN = "an-nyoung-ha-se-yo"
|
||||||
|
HELLO_IN_FRENCH = "bonjour!"
|
||||||
|
HELLO_IN_JAPANESE = "konichiwa!"
|
90
helloworld/ttypes.py
Normal file
90
helloworld/ttypes.py
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
#
|
||||||
|
# Autogenerated by Thrift Compiler (0.8.0)
|
||||||
|
#
|
||||||
|
# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
|
||||||
|
#
|
||||||
|
# options string: py:new_style
|
||||||
|
#
|
||||||
|
|
||||||
|
from thrift.Thrift import TType, TMessageType, TException
|
||||||
|
|
||||||
|
from thrift.transport import TTransport
|
||||||
|
from thrift.protocol import TBinaryProtocol, TProtocol
|
||||||
|
try:
|
||||||
|
from thrift.protocol import fastbinary
|
||||||
|
except:
|
||||||
|
fastbinary = None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class Message(object):
|
||||||
|
"""
|
||||||
|
Attributes:
|
||||||
|
- name
|
||||||
|
- lang
|
||||||
|
"""
|
||||||
|
|
||||||
|
thrift_spec = (
|
||||||
|
None, # 0
|
||||||
|
(1, TType.STRING, 'name', None, None, ), # 1
|
||||||
|
(2, TType.STRING, 'lang', None, "en", ), # 2
|
||||||
|
)
|
||||||
|
|
||||||
|
def __init__(self, name=None, lang=thrift_spec[2][4],):
|
||||||
|
self.name = name
|
||||||
|
self.lang = lang
|
||||||
|
|
||||||
|
def read(self, iprot):
|
||||||
|
if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
|
||||||
|
fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
|
||||||
|
return
|
||||||
|
iprot.readStructBegin()
|
||||||
|
while True:
|
||||||
|
(fname, ftype, fid) = iprot.readFieldBegin()
|
||||||
|
if ftype == TType.STOP:
|
||||||
|
break
|
||||||
|
if fid == 1:
|
||||||
|
if ftype == TType.STRING:
|
||||||
|
self.name = iprot.readString();
|
||||||
|
else:
|
||||||
|
iprot.skip(ftype)
|
||||||
|
elif fid == 2:
|
||||||
|
if ftype == TType.STRING:
|
||||||
|
self.lang = iprot.readString();
|
||||||
|
else:
|
||||||
|
iprot.skip(ftype)
|
||||||
|
else:
|
||||||
|
iprot.skip(ftype)
|
||||||
|
iprot.readFieldEnd()
|
||||||
|
iprot.readStructEnd()
|
||||||
|
|
||||||
|
def write(self, oprot):
|
||||||
|
if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
|
||||||
|
oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
|
||||||
|
return
|
||||||
|
oprot.writeStructBegin('Message')
|
||||||
|
if self.name is not None:
|
||||||
|
oprot.writeFieldBegin('name', TType.STRING, 1)
|
||||||
|
oprot.writeString(self.name)
|
||||||
|
oprot.writeFieldEnd()
|
||||||
|
if self.lang is not None:
|
||||||
|
oprot.writeFieldBegin('lang', TType.STRING, 2)
|
||||||
|
oprot.writeString(self.lang)
|
||||||
|
oprot.writeFieldEnd()
|
||||||
|
oprot.writeFieldStop()
|
||||||
|
oprot.writeStructEnd()
|
||||||
|
|
||||||
|
def validate(self):
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
L = ['%s=%r' % (key, value)
|
||||||
|
for key, value in self.__dict__.iteritems()]
|
||||||
|
return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
|
||||||
|
|
||||||
|
def __ne__(self, other):
|
||||||
|
return not (self == other)
|
39
server.py
Normal file
39
server.py
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
from helloworld import HelloWorld
|
||||||
|
from helloworld.ttypes import *
|
||||||
|
from helloworld.constants import *
|
||||||
|
|
||||||
|
from thrift.transport import TSocket
|
||||||
|
from thrift.transport import TTransport
|
||||||
|
from thrift.protocol import TBinaryProtocol
|
||||||
|
from thrift.server import TServer
|
||||||
|
|
||||||
|
|
||||||
|
class HelloWorldHandler:
|
||||||
|
def __init__(self):
|
||||||
|
self.log = {}
|
||||||
|
|
||||||
|
def ping(self):
|
||||||
|
return "pong"
|
||||||
|
|
||||||
|
def sayHello(self, msg):
|
||||||
|
if msg.lang in ('kp', 'kr'):
|
||||||
|
hello = HELLO_IN_KOREAN
|
||||||
|
elif msg.lang == 'fr':
|
||||||
|
hello = HELLO_IN_FRENCH
|
||||||
|
elif msg.lang == 'jp':
|
||||||
|
hello = HELLO_IN_JAPANESE
|
||||||
|
else:
|
||||||
|
hello = HELLO_IN_ENGLISH
|
||||||
|
return '%s %s' % (hello, msg.name)
|
||||||
|
|
||||||
|
handler = HelloWorldHandler()
|
||||||
|
processor = HelloWorld.Processor(handler)
|
||||||
|
transport = TSocket.TServerSocket('localhost', port=9090)
|
||||||
|
tfactory = TTransport.TBufferedTransportFactory()
|
||||||
|
pfactory = TBinaryProtocol.TBinaryProtocolFactory()
|
||||||
|
|
||||||
|
server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)
|
||||||
|
|
||||||
|
print 'Starting server...'
|
||||||
|
server.serve()
|
||||||
|
print('done!')
|
Reference in New Issue
Block a user