Можно ли создать приложение Tornado из экземпляров Request / Web Handlers вместо определений классов? - PullRequest
0 голосов
/ 30 марта 2020

Очевидное требование предоставить class определения вместо экземпляров вызывает очень сложные проблемы. У меня есть два разных класса, и один из них нуждается в ссылке на другой

  app = tornado.web.Application([
    (r"/fusion.*", FusionListener),
    (r"/admin.*", AdminListener),
  ])

. AdminListener нужна ссылка на FusionListener, поскольку есть внутренние элементы, которыми нужно управлять. Отправка сообщений здесь является недопустимой дополнительной сложностью. Нынешний механизм, по-видимому, не предоставляет такую ​​возможность.

Какая схема может обойти этот недостаток в Торнадо?

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

Публикация этого ответа для получения выгоды от правильного форматирования кода.
Парадигма, которую я использовал для отслеживания существующих экземпляров RequestHandler, очень проста:

class MyHandler(RequestHandler):
    _instances = set()

    def get(self):
        if needs_to_be_added(self.request):  # some conditions can be used here
            if len(MyHandler._instances) > THRESHOLD:  # careful with memory usage
                return self.finish("some_error")
            MyHandler._instances.add(self)
        ...

    def post(self):
        if needs_to_be_removed(self.request):
            MyHandler._instances.discard(self)
        ...

Конечно, вам может понадобиться изменить, когда добавлять / отбрасывать элементы.
В зависимости от того, как вы хотите ссылаться на существующие экземпляры в будущем (например, по некоторым ключам), вы можете использовать dict для отслеживания их.

Я не думаю, что вы можете использовать что-то слабые ссылки (как в классах из модуля weakref ), потому что они будут отслеживать только живых экземпляров, которые не будут работать с тем, как создаются и удаляются экземпляры обработчиков запросов.

0 голосов
/ 30 марта 2020

Для моего варианта использования есть как постоянное состояние, так и состояние в памяти. У нас есть spark и postgres репозитории для первых. Для последнего я уже разработал и написал приложение, чтобы иметь структуры данных на уровне экземпляра. Но я понял, что атрибуты экземпляра на Tornado запущенных RequestHandler / WebHandler подклассах не являются постоянными.

Последний хочет жить в классе, управляющем государством: но я вынужден значительно перерисовать границы из-за этой схемы Tornado. Вместо этого необходимо будет sh преобразовать все в глобальные переменные. Мало кто будет утверждать, что это был предпочтительный дизайн. Я буду сбрасывать tornado, как только смогу найти время.

Не уверен, что будет альтернативой: я уже вернулся из cherrypy из-за его существенных ограничений: вот пара моих вопросов по этому вопросу

Я прошел через те, у которых были шрамы но все же в целости и сохранности Были и другие проблемы, которые меня выбивали: url's не обслуживали, и не было ясного конца для кротов. Это также обычно не привлекает много внимания и имеет запутанную устаревшую или неполную документацию. Есть много документов - вот почему я начал с него: но дыры делают для серии эпизодов с охотой на кроликов.

Flask и django имеют свои проблемы , Кажется, поиск функционально адекватного, но не сверхтяжелого веб-сервера в python - иллюзорная цель. Пока не ясно, какие рамки имеют наименьшее количество ошибок.

...