Я создал простой сервер 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
На данный момент ваш ответ работает очень хорошо. Большое спасибо! – Escualo