我需要通过Thrift接口访问来自 Django webapp 的数据。我想以非阻塞方式执行此操作(例如,使用 libevent/gevent ......)但是周围没有很多示例实现(在 python 中),所以我想在这里询问任何示例/提示/经验!
请注意,这个问题是关于使用 Thrift,而不是任何其他协议,我知道为此目的可能有比 Django 更好的框架,但使用它也是一个要求!
我需要通过Thrift接口访问来自 Django webapp 的数据。我想以非阻塞方式执行此操作(例如,使用 libevent/gevent ......)但是周围没有很多示例实现(在 python 中),所以我想在这里询问任何示例/提示/经验!
请注意,这个问题是关于使用 Thrift,而不是任何其他协议,我知道为此目的可能有比 Django 更好的框架,但使用它也是一个要求!
这可以通过在Django 管理命令中实现一个节俭服务器来完成。请参阅您需要的文件结构的链接。在命令文件中,您可以称为“thrift_server.py”,然后您将实现通常的 thrift 服务器,如下所示:
import sys
from django.core.management.base import BaseCommand
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer
#import thrift files here
#now define the service handler according to your thrift method declaration
class ServiceHandler:
def __init__(self):
pass
#self.log = {}
def thriftMethodName(self, arg):
print "hello world!"
#here you have access to anything in the django framework
return True
class Command(BaseCommand):
def handle(self, *args, **kwargs):
handler = ServiceHandler()
processor = SaleService.Processor(handler)
transport = TSocket.TServerSocket(port=9090)
tfactory = TTransport.TBufferedTransportFactory()
pfactory = TBinaryProtocol.TBinaryProtocolFactory()
server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)
# You could do one of these for a multithreaded server
#server = TServer.TThreadedServer(processor, transport, tfactory, pfactory)
#server = TServer.TThreadPoolServer(processor, transport, tfactory, pfactory)
self.stdout.write('Starting thrift server...')
server.serve()
self.stdout.write('done.')
请注意,上面描述了多线程服务器选项,尽管我还没有测试这些选项。
然后,您可以按如下方式运行守护程序:
(virtualenv) /django_project/ > python manage.py thrift_server