【问题标题】:Sending Asynchronous Mail in Django - without writing to database?在 Django 中发送异步邮件 - 不写入数据库?
【发布时间】:2020-05-22 18:56:51
【问题描述】:

我希望通过异步发送邮件来加快我网站的加载时间。目前,我的代码如下所示:

def myFunction(content):
   result = modify(content)
   send_mail('My Subject', result, 'me@example.com')
   return render(request, 'page.html', result)

使用Django-Mailer,我发现我可以通过将电子邮件写入数据库而不是立即发送来缩短加载时间,然后让 cron + Django 邮件程序异步处理我数据库中的电子邮件。

但是,我希望我的数据库尽可能远离潜在的敏感信息,并希望避免将通过我的应用程序发送的任何电子邮件写入我的数据库。即使数据只是在短时间内写入,通过自动备份也有可能保存一些内容。

我知道这里是否没有解决方案,但有没有办法异步发送电子邮件无需每次将它们写入数据库?我真的不认为这是可能的,但我理想的希望是如果有办法返回响应,然后发送电子邮件。

def myFunction(content):
   result = modify(content)
   return render(request, 'page.html', result)
   send_mail('My Subject', result, 'me@example.com')

Django-After-Response 似乎是这样做的,但自 2015 年以来一直没有更新。

This answer 和this answer 也提供了潜在的解决方案。

【问题讨论】:

  • 有人认为我可以跳过发送电子邮件,但在返回结果后,向发送电子邮件的服务器发送另一个请求(不需要响应)
  • 好吧,我解决了我的问题,但我没有回答问题。我从 SMTP 切换到 API,它使我的邮寄时间减少了 90%。

标签: django asynchronous django-mailer


【解决方案1】:

这里有几个选项。一种方法是拥有一个任务队列和一个执行这些任务的工作人员。

我喜欢使用 Django-RQ https://github.com/rq/django-rq,但 Celery 是另一个不错的选择。 尽管有了这个,你需要运行一个工作实例,还需要一些东西来存储队列,比如 Redis。

为了更简单快捷的解决方案,我建议尝试 django-background-tasks: https://django-background-tasks.readthedocs.io/en/latest/# 这个将任务队列存储在数据库中,但它会处理它,因此您不必自己实现它。

【讨论】:

  • 感谢您的回答。我特别希望不写入数据库。否则,我只会使用 django-mailer。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 2012-08-11
  • 2015-06-08
  • 1970-01-01
相关资源
最近更新 更多