Немного сложный порядок;) но вот несколько начальных шагов для вас (очень сильно смоделированные, искаженные особенности, опущенные в примерах):
# your twisted imports...
import json
class MyProtocol(object): # Would be Protocol instead of object in real code
def dataReceived(self, data):
req = json.loads(data) # create a dictionary from JSON string
modname, funcname = req['method'].split('.')
m = __import__(modname)
method = getattr(m, funcname) # get the method
method(self, req['params']) # call the method
Предполагается, что вы попробуете это, как будтовыполнил это:
mp = MyProtocol()
mp.dataReceived('{"method":"somemod.add", "params":[1,2,3]}')
У вас есть модуль somemod.py
в том же каталоге, что и в примере, со следующим содержимым (зеркальное отображение вашего метода .add()
выше):
import json
def add(proto, params):
result = {} # initialize a dictionary to convert later to JSON
result['result'] = sum(params)
result['error'] = None
result['id'] = 1
proto.transport.write(json.dumps(result)) # return a JSON string
proto.transport.loseConnection() # close connection
Это позволяет использовать один модуль для каждого метода.Вышеуказанный вызов method(..
всегда будет передавать ваш экземпляр MyProtocol
вызывающему серверу.(Если вы действительно хотите использовать методы экземпляра, вот инструкции о том, как добавить методы с использованием python: http://irrepupavel.com/documents/python/instancemethod/)
Вам потребуется много обработки ошибок.Например, вам нужно много проверять ошибки при вызове split()
в строке 2 dataReceived()
.
. При этом вы можете иметь отдельные файлы с одной функцией для каждого метода, который вам нужно поддерживать.Ни в коем случае не полный пример, но он может помочь вам, так как то, что вы ищете, довольно сложно.
Для более формальной регистрации, я бы рекомендовал dict
в MyProtocol
с именамиметодов, которые вы поддерживаете, в соответствии с:
# in MyProtocol's __init__() method:
self.methods = {}
и метод регистра ..
def register(self, name, callable):
self.methods[name] = callable
.. modify dataReceived()
..
def dataReceived(self, data):
# ...
modname, funcname = self.methods.get(req['method'], False)
# ..continue along the lines of the dataReceived() method above
Краткий обзор слишком длинного поста: функция __import__
(http://docs.python.org/library/functions.html) наверняка станет ключевой частью вашего решения.