Рекомендуется ли сельдерей только для отправки электронной почты?

У меня есть api с django rest framework.

Апи предназначен для регистрации пользователя. После регистрации api отправляет пользователю письмо с подтверждением, но отправка письма занимает немного времени, поэтому для этой цели я хочу отправлять письмо в фоновом режиме.

Для выполнения этого требования каким должен быть подход?

Это должен быть ваш подход к достижению задачи, которую вы хотите выполнить.

  1. Установите celery
  2. создайте файл celery.py в папке проекта, где находится ваш файл settings.py (рекомендуется, но не обязательно) и вставьте следующий код в ваш файл. Замените example на название вашего проекта
  3. .
from celery import Celery
import os
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'example.settings')

app = Celery('example')

app.config_from_object(settings, namespace='CELERY')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
  1. Добавьте эти строки в свои настройки:
CELERY_BROKER_URL = 'redis://{}:{}'.format(REDIS_SERVER_HOST, REDIS_SERVER_PORT)
CELERY_RESULT_BACKEND = 'redis://{}:{}'.format(REDIS_SERVER_HOST, REDIS_SERVER_PORT)
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'

Убедитесь, что запустили сервер Redis и присвоили переменным REDIS_SERVER_HOST и REDIS_SERVER_PORT соответствующие значения.

  1. Откройте файл init.py из каталога вашего проекта и вставьте этот код
from .celery import app as celery_app

__all__ = ['celery_app']
  1. создайте файл task.py в каталоге вашего приложения и напишите функцию, которая отправляет электронное письмо Например:
from example import celery_app
from django.core.mail import send_mail

@celery_app.task
def send_celery_email(self, recipient_list):
    # your actual mail function
    send_mail("subject", "message", from_email = 'test@gmail.com', recipient_list = [recipient_list])
  1. Запустите свой сервер сельдерея с помощью
celery -A project worker --loglevel=info 
  1. вызовите эту_функцию из представлений как обычную функцию и передайте необходимые аргументы.
from .task import send_celery_email

send_celery_email.delay(recipient_list = [])

Примечание: Это всего лишь дорожная карта рабочего процесса, фактический код может отличаться в зависимости от ваших требований и версии celery. Также ознакомьтесь с документацией

Основное использование celery - это очередь сообщений. Для отправки электронной почты я рекомендую использовать поток.

Вернуться на верх