Я использую 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.
Может кто-нибудь показать мне, как это сделать?Заранее спасибо!