Задать вопрос
@robocop45

Почему celery дублирует сообщения на почте?

Сделал оповещения celery + redis, но сообщения на почту приходят вразнобой. То прилетают старые, то они дублируются 63f91c76bffd3357121547.jpeg

celery.py
import os

from celery import Celery

# Set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'habr.settings')
app = Celery('habr')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()


tasks.py
from blog.models import  Answer
from habr import settings
from django.core.mail import send_mail

from habr.celery import app



@app.task
def send_email_after_answer(s):

    for i in Answer.objects.all():
        send_mail(
            'MambrTeam, новый ответ ',
            f'Коментарий к {i.post} был добавлен, вот его текст '
            f'{i.text}',
            settings.EMAIL_HOST_USER,
            [i.post.author.email], # находим почту автора статьи 
            fail_silently=False
        )


views
def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.post = self.get_object()
        self.object.author = self.request.user
        self.object.save()
        send_email_after_answer.delay(form.instance.post.author.email) #здесь основная строка celery
        return super().form_valid(form)


settings
REDIS_HOST = '127.0.0.1'
REDIS_PORT = '6379'
CELERY_BROKER_URL = 'redis://' + REDIS_HOST + ":" + REDIS_PORT + '/0'
CELERY_BROKER_TRANSPORT_OPTIONS = {"visibility_timeout" : 3600}
CELERY_RESULT_BACKEND = 'redis://' + REDIS_HOST + ":" + REDIS_PORT + '/0'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
  • Вопрос задан
  • 99 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
tumbler
@tumbler Куратор тега Django
бекенд-разработчик на python
send_email_after_answer не использует свой аргумент s, а вместо этого проходится вообще по всем ответам в БД и заново переотправляет их на почту. Нужно передавать ID ответа в сигнатуру таски и использовать его для отправки.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы