我創建了一個簡單的RPC服務器來執行某些我們團隊通用的任務,但是這些任務是從不同的網絡調用的。服務器看起來是這樣的(我不包括爲簡潔的錯誤處理):以簡潔明瞭的方式向簡單的RPC服務器添加方法
from twisted.internet.protocol import Protocol, Factory
from twisted.internet import reactor
import json
class MyProtocol(Protocol):
def dataReceived(self, data):
req = json.loads(data) # create a dictionary from JSON string
method = getattr(self, req['method']) # get the method
method(req['params']) # call the method
def add(self, params):
result = {} # initialize a dictionary to convert later to JSON
result['result'] = sum(params)
result['error'] = None
result['id'] = 1
self.transport.write(json.dumps(result)) # return a JSON string
self.transport.loseConnection() # close connection
factory = Factory()
factory.protocol = MyProtocol
reactor.listenTCP(8080, factory)
reactor.run()
這是非常簡單的:服務器接收來自客戶端的JSON RPC請求,查找的方法,並調用該方法通過參數。該方法本身是返回JSON RPC響應的方法。對於不太熟悉,一JSON RPC看起來大約是這樣的:
request:
{"method":"my_method", "params":[1,2,3], "id":"my_id"}
response:
{"result":"my_result", "error":null, "id":"my_id"}
因爲我有我的服務宗旨電流很好的RPC服務器(你可以想像,我的任務很簡單)。但隨着任務複雜性的增加,我需要繼續添加方法。
我不想打開主文件並添加另一個def method3(...)
,兩週後添加def method4(...)
等等;代碼會變得太快,維護將變得越來越困難。
所以,我的問題是:我怎麼可以創建一個架構,讓我寄存器方法到服務器。一個好處是可以有一個單獨的文件夾,每個方法都有一個文件,這樣他們可以很容易地被共享和維護。不管他們對Twisted的理解如何,這個「架構」也會讓我推遲某些方法的維護。
我不在乎是否需要在每次註冊新方法時重新啓動服務器,但一個明顯的優點是如果我不也有:)。
謝謝。
非常感謝您的回答。我不知道我最終會做什麼,但你的方法是巧妙的,並使我走上正軌。 – Escualo 2010-07-07 22:12:46
目前,您的答案功能非常好。非常感謝! – Escualo 2010-07-12 23:08:36