【问题标题】:Send an email from an API endpoint using Django Rest Framework and Angular使用 Django Rest Framework 和 Angular 从 API 端点发送电子邮件
【发布时间】:2014-10-02 11:46:57
【问题描述】:

我想在 POST 成功完成后发送一封电子邮件。电子邮件将通过信号完成似乎是有道理的。我可以自己写,如此处所述:https://docs.djangoproject.com/en/1.6/topics/signals/#defining-and-sending-signals

但是,我想不通的是:

  1. Django Rest Framework 是否支持信号(为什么不支持,它只是 Django)
  2. 我应该听什么来发送自定义信号?发件人是什么?

欢迎提出建议。

另外,有人用 Angular 做这个吗?有没有我看不到的简单方法?

【问题讨论】:

  • 也许在 POST 成功后,您可以 HttpResponse 到某个 view,然后用于发送电子邮件?
  • 你找到好的设计模式了吗?发送电子邮件的最佳解决方案是什么? (也许重新定义 post_save 钩子)?

标签: django angularjs django-rest-framework django-signals


【解决方案1】:

旧版本 Django 的老问题,但如果有人遇到它...没有必要使用信号。 Django 现在有内置函数send_mail。这是文档:

https://docs.djangoproject.com/en/1.8/topics/email/

因此,您将使用该功能来创建和发送电子邮件。它甚至可以接受 HTML 模板作为消息参数并使用 Django 数据填充它,这很好。

所以你要定义一个包含这个方法的函数,例如:

def email_client(request):
    id = request.POST.get('id')
    client = Client.objects.get(id=id)
    msg_html = render_to_string('templates/email.html', {'client': client})
    template_email_text = ''
    return send_mail('Lelander work samples', template_email_text, 'test@emailsender.com', ['test@emailrecipient.com'], html_message=msg_html, fail_silently=False)

并将该函数包含在post 的 DRF API 视图中:

class ClientList(generics.ListCreateAPIView):

queryset = Client.objects.all()
serializer_class = ClientSerializer

def get(self, request, *args, **kwargs):
    return self.list(request, *args, **kwargs)

def post(self, request, *args, **kwargs):
    email_client(request)
    return self.create(request, *args, **kwargs)

【讨论】:

    【解决方案2】:
    1. 是的,DRF 支持信号。

    我对问题 2 没有很好的答案,主要是因为我认为这样做的最佳位置是在您班级的 post_save 方法中。这样,您就可以确定您的对象已创建,您可以访问该对象和请求,并且您无需费心实现信号(这可能需要另一个类来发送电子邮件)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-02
      • 1970-01-01
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多