Телебот + Сельдерей + Питранзитез: ответ на задание - PullRequest
1 голос
/ 04 ноября 2019

Я хочу отправить некоторое сообщение после задержки, используя Celery. После того, как пользователи получают сообщение, его состояние запускает новое. Для этого мне нужно отправить объект telebot.types.Message в качестве аргумента в задачу Celery. Как я могу сделать это правильно?

Моя функция перехода для запуска задачи Celery:

 def delay_message(self, event):
        celery_utils.delay_message.apply_async(kwargs={'response': self.response}, countdown=1) # self.response is telebot.types.Message

Задача Celery:

@celery.task()
def delay_message(response):
    machine = routes.DialogMachine(transitions=app.config['transitions'])
    machine.response = response
    machine.send_random_motivation_message()

В send_random_motivation_message() мне нужны telebot.types.Message в качестве self.response, но не может отправить этот тип в задачу Celery.

1 Ответ

1 голос
/ 04 ноября 2019

Полагаю, вы не можете отправить его, потому что он не сериализуем, верно? В этом случае вы можете отправить столько параметров, сколько необходимо для словаря или кортежа, и создать telebot.types.Message внутри задачи Celery.

Вы можете попробовать jsonpickle для генерации JSON из маринованного объекта telebot.types.Message, передачи его в задачу Celery и внутри задачи используйте jsonpickle для воссоздания объекта.

...