【问题标题】:Is celery recommended for email sending only?芹菜是否只推荐用于电子邮件发送?
【发布时间】:2022-01-04 00:05:53
【问题描述】:

我有一个带有 django rest 框架的 api。

该 api 用于用户注册。注册后 api 将向用户发送验证电子邮件,但发送电子邮件需要一些时间,所以为此我想在后台发送电子邮件。

对于这个要求应该是什么方法?

【问题讨论】:

  • 是啊,继续吃芹菜...

标签: django django-rest-framework celery


【解决方案1】:

这应该是您完成要执行的任务的方法。

  1. 安装 celery
  2. 在您的项目文件夹中创建一个 celery.py 文件,您的 settings.py 文件所在的位置(推荐但不是必需的) 并将以下代码粘贴到您的文件中。 将示例替换为您的项目名称
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. 在你的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])
  1. 使用启动 celery 服务器
celery -A project worker --loglevel=info 
  1. 从视图中调用 this_function 作为普通函数并传递所需的参数。
from .task import send_celery_email

send_celery_email.delay(recipient_list = [])

注意:这只是工作流程的路线图,实际代码可能会根据您的要求和 celery 版本而有所不同。 还可以查看documentation

【讨论】:

    猜你喜欢
    • 2018-05-08
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 2014-07-25
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多