django -rest-auth обработка просроченного письма с подтверждением - PullRequest
0 голосов
/ 15 февраля 2020

Я использую django -rest-auth и django -allauth для обработки аутентификации пользователя в моих остальных API. Когда пользователь пытается подтвердить свою электронную почту после истечения срока действия ссылки, я получаю страницу с неприятной ошибкой.

enter image description here

Пожалуйста, как я могу отобразить лучшую страницу с ошибкой или отправить сообщение о том, что она не удалась, потому что срок действия ссылки истек?

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Насколько я понимаю, ваша ошибка исходит от django-allauth, а не от вашего проекта. Причина ошибки заключается в том, что вы не включили allauth.url в свой основной urls.py (подробнее об этом будет рассказано в следующем разделе).

Возможные решения

Первое решение

Добавьте allauth.urls в ваш urls.py:

urlpatterns = [
    ...
    path('accounts/', include('allauth.urls')),
    ...
]

Второе решение

Если вы go глубоко погрузитесь в проблему, вы увидите, что ошибка говорит NoReverseMatch error, что происходит, когда есть имя URL, которое не найдено в проекте ie account_login. Теперь эта ошибка исходит из шаблона на allauth base template.

Судя по вашему коду, эта ошибка возникает из-за этой строки: ( Я позволил себе проверить вашу кодовую базу github, так как она была с открытым исходным кодом. )

if not email_confirmation:
    if queryset is None:
        queryset = self.get_queryset()
    try:
        email_confirmation = queryset.get(key=key.lower())
    except EmailConfirmation.DoesNotExist:
        # A React/Vue Router Route will handle the failure scenario
        return HttpResponseRedirect('/login/failure/')  # <-- Here

Указывает на неправильный URL, который не существует в системе. Пожалуйста, отметьте django-rest-auth urls.

Так что одним из исправлений здесь является предоставление здесь шаблона ответа с таким представлением:

# in accounts/api/urls.py
path('failure/', TemplateView.as_view(template_name='api_failure.html'))

Другое решение состоит в том, чтобы предоставить custom 404 template следующим образом:

# accounts/api/views.py
def handler404(request, exception, template_name="your_custom_404.html"):
    response = render_to_response(template_name)
    response.status_code = 404
    return response

# root urls.py

 handler404 = 'accounts.api.views.handler404'
1 голос
/ 20 февраля 2020

написать свой собственный обработчик исключений

from rest_framework.views import exception_handler

def custom_exception_handler(exc, context):
# Call REST framework's default exception handler first,
# to get the standard error response.
response = exception_handler(exc, context)

# Now add the HTTP status code to the response.
if response is not None:
    response.data['status_code'] = response.status_code

return response
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...