Модели Django, сигналы и задержка отправки электронной почты
Я добавил сигнал к моей модели, который отправляет электронную почту на некоторые адреса электронной почты после сохранения модели (через models.signals.post_save.connect сигнал и send_mail для отправки электронной почты). Эта идея все еще делает задержку для пользователей, когда они сохраняют модель на сайте, они должны ждать, пока все эти письма не будут отправлены, и тогда они получат ответ от сервера.
Прежде чем пробовать сигналы, я попытался обернуть метод сохранения моей модели, а после super(Foo, self).save(*args, **kwargs) я отправлял электронные письма. Этот опыт задержки происходил и этим методом тоже.
Я просто хочу, чтобы мои действия по отправке электронной почты выполнялись в фоновом режиме, не показывая задержек пользователям на сайте.
Как это можно решить?
2 ответов:
Проще всего поставить сообщения электронной почты в очередь, а затем отправить их демоном. Проверьте django-mailer.
Поскольку вы, по-видимому, интересуетесь только send_mail, вы можете начать с двух шагов. Во-первых, используйте это для импорта версии send_mail от django-mailer:
# favour django-mailer but fall back to django.core.mail from django.conf import settings if "mailer" in settings.INSTALLED_APPS: from mailer import send_mail else: from django.core.mail import send_mailА затем создайте cronjob, который вызывает
manage.py send_mailдля отправки почты. ПроверьтеDjango-mailer usage docs , например, записи cronjob.Если вы не видите никакой электронной почты получить отправлено, попробуйте запустить
manage.py send_mailна консоли. Похоже, это проблема номер один, с которой сталкиваются люди.
Чтобы избежать задержки ответа, вы хотите сделать это асинхронно в другом процессе.
Этот вопрос о том, как справиться с этим: Советы по Python / Django и очередям сообщений
Comments