Django:在后台发送电子邮件的最佳方式?

时间:2012-11-26 14:44:38

标签: django multithreading background-process

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

关于什么是最佳方法的任何想法?

我已经阅读了关于芹菜的内容,但似乎有很多步骤来设置芹菜:http://markliu.me/2011/sep/29/django-celery-on-webfaction-using-rabbitmq/那没关系,但我想知道这是尝试之前的方法。< / p>

线程怎么样? http://www.artfulcode.net/articles/threading-django/

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

您有其他经验的人吗?

4 个答案:

答案 0 :(得分:4)

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

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

  2. Celery - 是标准的方式,很容易添加到django(只看到很多关于django-celery的教程之一,对于你的任务使用数据库作为经纪人就足够了)

  3. Cron jobs - 程序员的方式并不是很好,因为你的代码会存储在你的repo和system crontab中。每次你都应该考虑这个问题。

  4. 其他方式是使用像Eventlet或Gevent这样的东西。绿色线程将在闲置中工作,并且对于您的标准任务 - 非常容易添加。缺点: - 你应该对greenlets了解很多,你应该小心错误地捕获greenlet。

  5. 我建议使用Celery,因为现在很容易添加它,很多教程和文档。此外,您的应用程序也很容易成长。

答案 1 :(得分:1)

我可能会选择Python RQ。这是Celery的一个更小的替代品,非常容易设置和使用。你需要redis。

答案 2 :(得分:1)

我会强烈考虑使用芹菜。它并不像它看起来那么复杂,是进行任意异步任务的好工具。但是,使用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作业安排此命令。但是,我个人宁愿使用芹菜或类似的东西。这是一个更多的前期工作,但从长远来看是值得的。

答案 3 :(得分:0)

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