首页 > 解决方案 > API 不发送电子邮件

问题描述

我正在尝试构建一个休息 API,它将向用户询问电子邮件、主题和消息,并将该主题和消息从 settings.py 文件中注册的电子邮件发送到电子邮件字段中提供的电子邮件。

我的models.py如下:

class Email(models.Model):
    email = models.EmailField(null=False)
    subject = models.CharField(max_length=250, null=False)
    message = models.CharField(max_length=500, null=False)

    def __str__(self):
        return self.email

我的views.py如下:

class EmailView(viewsets.ModelViewSet):
    serializer_class = EmailUser

    def get_queryset(self):
        queryset = Email.objects.all()
        return queryset

serializer.py 文件看起来像这样:

class EmailUser(serializers.ModelSerializer):
    class Meta:
        model = Email
        fields = ('id', 'email', 'subject', 'message')

    def send_email_user(self, subject, message, from_email=None, **kwargs):
        return send_mail(subject, message, from_email, [self.email], **kwargs)

和 urls.py 如下:

url(r'email-user/', csrf_exempt(EmailView.as_view({'post': 'create', 'get': 'list'})))

我希望它将电子邮件发送到提供的电子邮件地址,但是当我 POST 调用电子邮件时,主题和消息存储在数据库中,但电子邮件不会发送到提供的电子邮件。

我是 django rest 框架的新手,如果有人能准确地告诉我我做错了什么,这将非常有帮助。

标签: djangodjango-rest-framework

解决方案


ViewSet 没有 post 方法

ViewSet 类只是一种基于类的 View,它不提供任何方法处理程序,例如 .get() 或 .post(),而是提供诸如 .list() 和 .create() 之类的操作。

您可以尝试改用 CreateModelMixin 和 ListAPIView。

视图.py

from rest_framework import generics, mixins

class EmailAPIView(mixins.CreateModelMixin, generics.ListAPIView):
    serializer_class = EmailUser

    def get_queryset(self):
        queryset = Email.objects.all()
        return queryset

    def perform_create(self, serializer):
        serializer.save(user=self.request.user)

    def post(self, request, *args, **kwargs):
        subject = request.POST.get('subject')
        message = request.POST.get('message')
        from_email = request.POST.get('from_email')
        user = # Do some logic to get your user here
        send_mail(subject, message, from_email, [user.email], **kwargs)
        return self.create(request, *args, **kwargs)

    def get_serializer_context(self, *args, **kwargs):
        return {'request': self.request}

推荐阅读