Django как настроить сброс пароля rest-auth для отправки электронной почты с помощью SendGrid - PullRequest
0 голосов
/ 24 февраля 2019

Я использую Django rest-auth, и я пишу метод для отправки пользователю электронной почты для сброса пароля.Но вместо использования способа отправки электронной почты по умолчанию я бы хотел использовать SendGrid для отправки электронной почты.

views.py

class PasswordResetSerializer(serializers.Serializer):
    email = serializers.EmailField()
    password_reset_form_class = PasswordResetForm

    def get_email_options(self):
        return {}

    def validate_email(self, value):
        self.reset_form = self.password_reset_form_class(data=self.initial_data)
        if not self.reset_form.is_valid():
            raise serializers.ValidationError(self.reset_form.errors)
        return value

    def save(self):
        request = self.context.get('request')
        opts = {
            'use_https': request.is_secure(),
            'from_email': getattr(settings, 'DEFAULT_FROM_EMAIL'),
            'request': request,
        }

        opts.update(self.get_email_options())
        self.reset_form.save(**opts)

serializers.py

class PasswordResetView(GenericAPIView):
    serializer_class = PasswordResetSerializer
    permission_classes = (AllowAny,)

    def post(self, request, *args, **kwargs):

        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()

        return Response(
            {"detail": _("Password reset e-mail has been sent.")},
            status=status.HTTP_200_OK
        )

Функция SendGrid

class SendEmail(View):
def get(self, request, *args, **kwargs):
    from_email_address = self.request.GET['from_email_address']
    to_email_address = self.request.GET['to_email_address']
    email_subject = self.request.GET['email_subject']
    email_content = self.request.GET['email_content']

    sg = sendgrid.SendGridAPIClient(apikey=settings.SENDGRID_API_KEY)
    from_email = Email(from_email_address)
    to_email = Email(to_email_address)
    subject = email_subject
    content = Content("text/plain", email_content)
    mail = Mail(from_email, subject, to_email, content)
    response = sg.client.mail.send.post(request_body=mail.get())
    print(response.status_code)
    return HttpResponse('Email has been sent!')

Мне известно, что сначала я должен использовать

url(r'^password/reset/$', PasswordResetView.as_view(), name='rest_password_reset'),

, чтобы отправить пользователю электронное письмо со ссылкой, содержащей «uid» и «token» насбросить парольи затем используйте:

url(r'^password/reset/confirm/$', PasswordResetConfirmView.as_view(), name='rest_password_reset_confirm'),

для сброса пароля.

Проблема, с которой я здесь сталкиваюсь, заключается в том, что я не уверен, как 'token' и 'uid' генерируются в PasswordResetSerializer и отправляются пользователю.Поэтому я не уверен, как изменить сериализаторы и представления, чтобы я мог использовать функцию SendGrid для отправки eamil.

Может кто-нибудь показать мне, как это сделать?Заранее спасибо!

...