Подготовить
- Проект Django с Логика длинной задачи
- Сельдерей с любым бэкэндом
Например: отправьте кнопку после любого пользователя или пользователя Event или AUTH через SMS-код или ссылку электронной почты.
Марк: Для пользователей входа/регистрации через SMS вы можете использовать Эта библиотека
Проблемы
- Django сигналы Синхронный по умолчанию
- Мы должны ждать, когда транзакция завершена
- Клиенты могут дождаться ответа надолго
Краткое описание
- Настроить сельдерей
- Создать приложение (например,
Уведомлитель
) - Настроить
post_save
сигнал черезсельдерей
задача - Настроить
Appconfig
загрузить функцию
Деталь
- Создать
Уведомлитель
применение - Добавить
Задача
tasks.py import uuid from collections import namedtuple from django.db.models.signals import post_save from run_celery import app from some_apps.models import SomeModel1, SomeModel2, SomeModel3 Ctx = namedtuple('Ctx', 'class_name identifier') models = [ SomeModel1, SomeModel2, SomeModel3 ] def register_models(): for model in models: post_save.connect(_post_save, sender=model, dispatch_uid=uuid.uuid4()) def _post_save(sender, instance, **kwargs): ctx = Ctx(class_name=instance.__class__.__name__, identifier=instance.pk) _async_post_save_handler.delay(ctx) @app.task def _async_post_save_handler(ctx: Ctx): """ Get model and instance from notifier object and then make some other logic """ ...
Наконец, добавьте в Apps.py
:
from django.apps import AppConfig class NotifierConfig(AppConfig): name = 'notifier' def ready(self): from apps.notifier.tasks import register_models register_models() # here!
Сохранить и беги django и запустить сельдерей.
Вывод
сельдерей
Помогите создать асинхронные обработчики к вашим моделям Django- Решение здорово для отделения
post_save
и асинхронная логика
Спасибо за чтение
Оригинал: “https://dev.to/a1k89/making-django-s-signals-async-with-celery-1lb5”