Рекомендуется ли сельдерей только для отправки электронной почты?
У меня есть api с django rest framework.
Апи предназначен для регистрации пользователя. После регистрации api отправляет пользователю письмо с подтверждением, но отправка письма занимает немного времени, поэтому для этой цели я хочу отправлять письмо в фоновом режиме.
Для выполнения этого требования каким должен быть подход?
Это должен быть ваш подход к достижению задачи, которую вы хотите выполнить.
- Установите celery
- создайте файл celery.py в папке проекта, где находится ваш файл settings.py (рекомендуется, но не обязательно) и вставьте следующий код в ваш файл. Замените example на название вашего проекта .
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)
- Добавьте эти строки в свои настройки:
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 соответствующие значения.
- Откройте файл init.py из каталога вашего проекта и вставьте этот код
from .celery import app as celery_app
__all__ = ['celery_app']
- создайте файл 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])
- Запустите свой сервер сельдерея с помощью
celery -A project worker --loglevel=info
- вызовите эту_функцию из представлений как обычную функцию и передайте необходимые аргументы.
from .task import send_celery_email
send_celery_email.delay(recipient_list = [])
Примечание: Это всего лишь дорожная карта рабочего процесса, фактический код может отличаться в зависимости от ваших требований и версии celery. Также ознакомьтесь с документацией
Основное использование celery - это очередь сообщений. Для отправки электронной почты я рекомендую использовать поток.