【问题标题】:Django: Best way to send email in background?Django:在后台发送电子邮件的最佳方式?
【发布时间】:2012-11-14 01:35:24
【问题描述】:

我正在从 Django 发送电子邮件(使用 Webfaction)。但是,这很慢,所以我想在后台发送电子邮件,即使电子邮件尚未发送,也会向用户返回响应。

有什么想法是最好的方法吗?

我读过关于 celery 的文章,但设置它似乎需要很多步骤:http://markliu.me/2011/sep/29/django-celery-on-webfaction-using-rabbitmq/ 没关系,但我想知道这是在尝试之前要走的路。

线程呢? http://www.artfulcode.net/articles/threading-django/

还是 cron 作业? http://docs.webfaction.com/software/general.html

你有其他经验吗?

【问题讨论】:

标签: django multithreading background-process


【解决方案1】:

我可能会选择Python RQ。这是 Celery 的最小替代品,并且非常易于设置和使用。不过你需要 redis。

【讨论】:

    【解决方案2】:

    我强烈考虑使用 Celery。它并不像看起来那么复杂,是执行任意异步任务的好工具。但是,有一种简单的方法可以使用 Django 和标准的 cron 作业来处理后台电子邮件。

    首先,创建一个 Django 模型来保存要发送的电子邮件。

    class EmailsToSend(models.Model):
      email = models.Email...
      .
      . 
      .
    

    接下来,创建一个 Django 管理命令来发送未发送的电子邮件。有关如何执行此操作的更多详细信息,请参阅Django documentation。此代码为您提供了基本概念。

    class Command(BaseCommand):
    
        def handle(self, *args, **options):
            emails = EmailsToSend.objects.all()
            for email in emails:
               send_my_email(email)
               email.delete()
    

    然后您可以使用 cron 作业安排此命令。但是,我个人更愿意使用 Celery 或类似的东西。前期工作要多一些,但从长远来看是有回报的。

    【讨论】:

      【解决方案3】:

      取决于您的应用程序的规模。如果计划保持最小和小,线程工作正常,cronjobs 也可以。但是您很快就会想将大量工作委托给后台以加快请求/响应时间。所以是的,在 webfaction 上设置 celery+rabbit 是一项半复杂的任务(已经在那里),但从长远来看,你会节省时间和精力。

      【讨论】:

        【解决方案4】:

        让我们对可能的解决方案做一个简单的概述:

        1. 线程是不好的解决方案 - 因为它们仅在您的响应未发送之前才有效。

        2. Celery - 是标准方式,很容易添加到 django(只需查看有关 django-celery 的大量教程之一,您的任务使用数据库作为代理就足够了)

        3. Cron 作业 - 不是真正适合程序员的方式,因为您的代码将存储在您的 repo 和系统 crontab 中。所以每次你都应该考虑一下。

        4. 其他方法是使用 Eventlet 或 Gevent 之类的东西。绿色线程将在空闲状态下工作,并且对于您的标准任务 - 很容易添加。缺点: - 是不是对greenlet要了解很多,要小心greenlet的错误捕捉。

        我推荐使用 Celery,因为它现在很容易添加,有很多教程和文档。此外,它会随着您的应用程序轻松成长。

        【讨论】:

        • 我会试一试 Celery 并评论它的情况。可能需要一段时间......开始了其他的事情。
        • “因为它们仅在您未发送响应之前才生效”?
        • @rustem 你能解释一下吗,“因为它们只有在你的回复没有发送之前才有效”
        猜你喜欢
        • 2014-10-30
        • 2013-04-28
        • 2011-09-08
        • 2012-09-20
        • 1970-01-01
        • 1970-01-01
        • 2013-02-12
        • 2011-09-13
        • 2011-07-12
        相关资源
        最近更新 更多