Есть ли способ для классов BaseRequestHandler быть с состоянием? - PullRequest
4 голосов
/ 18 декабря 2011

Краткий вопрос
Используя мои примеры ниже, есть ли Pythonic способ поделиться фактическим экземпляром my_object с классом BaseRequestHandler?

Фон
По определению, класс BaseRequestHandler создает новый экземпляр для каждого запроса.В связи с этим я пытаюсь найти решение о том, как получить данные из функции handle() обратно в экземпляр ProtocolInterface.Обратите внимание, что это может быть неправильным подходом, если мне нужно что-то сделать в handle(), кроме print to stdout.

В настоящий момент я не верю, что глобальные переменные будут работать, потому что my_object передается и, как ожидается, будет часто меняться (вот почему handle() нужно это увидеть. Чтобы увидеть примерклиент (отправка фиктивных данных), см. мой другой вопрос SO . Я думаю, что самая большая проблема, с которой я сталкиваюсь, это то, что серверы сокетов работают в фоновом потоке.

Пример того, что яхотел бы сделать

class ProtocolHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        while(1):
            self.data = self.request.recv(1024)
            if self.data == '':
                break
            self.request.send("Success") 
            self.my_object.success = True#  <--- How can I share my_object's instance?

class ProtocolInterface():
    def __init__(self, obj, host='127.0.0.1', port=8000, single_connection=False):
        self.my_object = obj # <--- This ideally is the same instance seen in ProtocolHandler
        self.host = host
        self.port = port

        # Create the socket server to process in coming traffic
        if(single_connection):
            self.server = SocketServer.TCPServer((self.host, self.port), ProtocolHandler)
        else:
            self.server = SocketServer.ThreadingTCPServer((self.host, self.port), ProtocolHandler)

    def start(self):
        print "Server Starting on HOST: " + self.host
        server_thread = threading.Thread(target=self.server.serve_forever)
        server_thread.daemon = True
        server_thread.start()

1 Ответ

8 голосов
/ 18 декабря 2011

Вы можете передать объект через экземпляр сервера:

self.server = SocketServer.TCPServer((self.host, self.port), ProtocolHandler)
self.server.my_object = self.my_object

Документация указывает, что вы можете иметь доступ к экземпляру сервера в handle() как self.server.

...