AttributeError: у объекта «Приложение» нет атрибута «webSocketsPool» - PullRequest
0 голосов
/ 03 мая 2020

Я хочу self.webSocketsPool = [] в моем коде, потому что у меня есть ошибка AttributeError: У объекта 'Application' нет атрибута 'webSocketsPool'. Но я не знаю, где мне нужно вставить это в мое приложение торнадо.

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
        (r"/dishtypes/(.*)", DishTypesHandler),
        (r"/test", testhandler),
        (r"/user/([0-9]+)", UserProfile),
        (r"/login", LoginHandler),
        (r"/testcookie", testcoockie),
        (r"/registration", registrationHandler),
        (r"/authentication", authHandler),
        (r"/remc", removecockie),
        (r"/adddish", addDish),
        (r"/getusrbasket", getUserBasket),
        (r"/payorder", payOrder),
        (r"/clientorders", clientOrdersHandler),
        (r"/clientorders/([0-9]+)", clientOrdersIdHandler),
        (r'/websocket/?', WebSocket),

    ], **settings,
        template_path=os.path.join(os.path.dirname(__file__), "templates"),
        static_path=os.path.join(os.path.dirname(__file__), "static"),
        default_handler_class=NotFoundHandler)


if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

строка ошибки находится в этом классе

class WebSocket(tornado.websocket.WebSocketHandler):
    def open(self):
        self.application.webSocketsPool.append(self)

    def on_message(self, message):
        db = self.application.db
        message_dict = json.loads(message);
        db.chat.insert(message_dict)
        for key, value in enumerate(self.application.webSocketsPool):
            if value != self:
                value.ws_connection.write_message(message)

    def on_close(self, message=None):
        for key, value in enumerate(self.application.webSocketsPool):
            if value == self:
                del self.application.webSocketsPool[key]

1 Ответ

0 голосов
/ 03 мая 2020

Вы можете прикрепить список к объекту приложения после его создания:

if __name__ == "__main__":
    app = make_app()
    app.webSocketsPool = []
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

Однако для повышения производительности следует учитывать set вместо list.

...