Рубрики
Без рубрики

Делать сигналы Django Async с сельдереем

Подготовьте проект Django с логикой длинной задачи Сельдерей с любым бэкдом Например: Отправить … Помеченные Джанго, Python.

Подготовить

  • Проект Django с Логика длинной задачи
  • Сельдерей с любым бэкэндом

Например: отправьте кнопку после любого пользователя или пользователя Event или AUTH через SMS-код или ссылку электронной почты.

Марк: Для пользователей входа/регистрации через SMS вы можете использовать Эта библиотека

Проблемы

  • Django сигналы Синхронный по умолчанию
  • Мы должны ждать, когда транзакция завершена
  • Клиенты могут дождаться ответа надолго

Краткое описание

  • Настроить сельдерей
  • Создать приложение (например, Уведомлитель )
  • Настроить post_save сигнал через сельдерей задача
  • Настроить Appconfig загрузить функцию

Деталь

  1. Создать Уведомлитель применение
  2. Добавить Задача
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”