Электронная почта для сброса пароля Django REST Auth отправляет URL API вместо URL-адреса реакции интерфейса

Я использую dj-rest-auth с Django в качестве серверной части и React.js в качестве интерфейса. Я хочу, чтобы электронное письмо для сброса пароля указывало на мой URL-адрес интерфейса React, а не на конечную точку API по умолчанию.

Отправка: http://localhost:8000/api/auth/password/reset/confirm/{uidb64}/{token}

Правильный URL-адрес: https://my-domain.com/password-reset/confirm/{uidb64}/{token}

.env

BASE_URL=https://my-domain.com

settings.py

REST_AUTH = {
    'PASSWORD_RESET_CONFIRM_URL': env('BASE_URL')+'/password-reset/confirm/{uidb64}/{token}',
    'PASSWORD_RESET_SERIALIZER': 'users.serializers.CustomPasswordResetSerializer',
}

urls.py

from django.urls import path, re_path
from .views import (
    CustomPasswordResetView
)
from dj_rest_auth.views import LogoutView, PasswordResetConfirmView, PasswordResetView

urlpatterns = [
    path('password/reset/', CustomPasswordResetView.as_view(), name='rest_password_reset'),
    path('password/reset/confirm/<uidb64>/<token>/',
         PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
]

views.py

class CustomPasswordResetView(PasswordResetView):
    serializer_class = CustomPasswordResetSerializer

serializers.py

class CustomPasswordResetSerializer(DjRestAuthPasswordResetSerializer):
    def get_email_options(self):
        return {
            'email_template_name': 'registration/password_reset_email.html',
            'extra_email_context': {
                'password_reset_url': settings.REST_AUTH['PASSWORD_RESET_CONFIRM_URL'],
            }
        }

password_reset_email.html

# failed to test both styles of URL
<a href="{{ password_reset_url }}">{{ password_reset_url }}</a>
<a href="{{ base_url }}/password-reset/confirm/{{ uid }}/{{ token }}">{{ base_url }}/password-reset/confirm/{{ uid }}/{{ token }}</a>

Проблема: • Электронное письмо по-прежнему отправляет URL API по умолчанию. • Я хочу, чтобы оно отправляло мой пользовательский URL интерфейса React. • Я хочу использовать пользовательский шаблон электронной почты.

Я пробовал: • PASSWORD_RESET_CONFIRM_URL в настройках • extra_email_context в пользовательском сериализаторе • Изменение шаблона с помощью {{ base_url }}

...но URL-адрес сброса в электронном письме по-прежнему указывает на внутренний API.

Вопрос: Как я могу настроить dj-rest-auth для отправки пользовательского URL-адреса интерфейса в электронном письме для сброса пароля, используя мой пользовательский шаблон электронной почты?

<время работы/>
Python                    3.11.2
django-sslserver          0.22
djangorestframework       3.15.2
dnspython                 2.7.0
ipython                   8.12.3
mysql-connector-python    9.1.0
opencv-python             4.10.0.84
python-dateutil           2.9.0.post0
python-dotenv             1.0.1
python-jose               3.5.0
python-multipart          0.0.20
<время работы/>

Чтобы использовать URL вашего приложения вместо URL api, вам нужно будет написать пользовательский сериализатор для сброса пароля и переопределить get_email_options:

from dj_rest_auth.serializers import PasswordResetSerializer

from decouple import config # or use env as you used


BASE_URL = config('BASE_URL')


def custom_url_generator(request, user, temp_key):
    return f'{BASE_URL}?token={temp_key}'


class CustomPasswordResetSerializer(PasswordResetSerializer):
    def get_email_options(self):
        return {
            'url_generator': custom_url_generator
        } 

Это позволяет настроить URL-адрес, который будет отправляться вашим пользователям, используя шаблон электронной почты по умолчанию, предоставляемый allauth.

Чтобы использовать пользовательский шаблон электронной почты, вы можете переопределить исходную структуру электронной почты:
В корневом каталоге вашего проекта создайте каталог электронной почты templates > account>. Теперь добавьте файлы base_message.txt и password_reset_key_message.txt. Вы можете взять структуру из официального каталога шаблонов allauth. Теперь, если вы оставите {{ password_reset_url }} в вашем password_reset_key_message.txt без изменений, его значение должно быть взято из custom_url_generator, которое мы определили ранее.

Обратитесь к этому комментарию по аналогичному вопросу.

Вернуться на верх