Глобальная переменная Django для хранения неизменяемого объекта - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь настроить библиотеку python-telegram-bot в режиме webhook с Django. Это должно работать следующим образом: при запуске Django я делаю начальную установку python-telegram-bot и в результате получаю объект dispatcher. Django слушает /telegram_hook url и получает обновления от серверов Telegram. Далее я хочу передать обновления методу process_update dispatcher, созданному при запуске. Он содержит всю логику синтаксического анализа и вызывает обратные вызовы, указанные во время установки.

Проблема в том, что объект dispatcher необходимо сохранить глобально. Я знаю, что глобальные состояния - это зло , но на самом деле это не глобальное состояние, потому что dispatcher является неизменным. Тем не менее, я до сих пор не знаю, где его разместить и как обеспечить, чтобы он был виден всем потокам после завершения фазы установки. Поэтому вопрос заключается в том, как правильно сохранить dispatcher после установки, чтобы вызвать его из viewset?

Джанго.

P.S. Я знаю, что я мог бы использовать встроенный веб-сервер или использовать опрос или что-то еще. Однако у меня есть причины использовать Django, и я в любом случае хотел бы знать, как справляться с подобными случаями, потому что это не единственная ситуация, которую я могу себе представить, когда мне нужно хранить неизменяемый объект, созданный при запуске глобально.

1 Ответ

0 голосов
/ 15 мая 2018

Похоже, вам нужен потокобезопасный синглтон, как этот https://gist.github.com/werediver/4396488 или http://alacret.blogspot.ru/2015/04/python-thread-safe-singleton-pattern.html

import threading

# Based on tornado.ioloop.IOLoop.instance() approach.
# See https://github.com/facebook/tornado
class SingletonMixin(object):
    __singleton_lock = threading.Lock()
    __singleton_instance = None

    @classmethod
    def instance(cls):
        if not cls.__singleton_instance:
            with cls.__singleton_lock:
                if not cls.__singleton_instance:
                    cls.__singleton_instance = super(SingletonMixin, cls).__new__(cls)
        return cls.__singleton_instance
...