Настройка аллаута Джанго EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL не работает
Я пытаюсь изменить направление перенаправления пользователя после того, как он подтвердил свой адрес электронной почты, щелкнув ссылку в письме с подтверждением.
Я использую Django 2.0.10 с allauth, rest-auth и rest-framework. Для проверки электронной почты я использую представление Аллаута по умолчанию.
В моем settings.py я установил следующее:
INSTALLED_APPS = [
'api',
'dynamic_rest',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'rest_framework.authtoken',
'django.contrib.sites',
'allauth.account',
'allauth.socialaccount',
'rest_auth.registration',
'users',
'lists',
'rest_auth',
'allauth', # needs to be at the end so custom templates are found first
]
EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL = '/'
print('EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL')
print(EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL)
urls.py
from allauth.account.views import confirm_email
urlpatterns = [
re_path(r'^rest-auth/registration/account-confirm-email/(?P<key>[-:\w]+)/$', confirm_email,
name='account_confirm_email'),
...
]
Моя настройка '/' действительно напечатана в консоли, поэтому я думаю, что она подхватывается приложением. Но когда я перехожу по ссылке в электронном письме на страницу ( http://localhost:8000/api/v1/rest-auth/registration/account-confirm-email/MTQ:1gpYgM:_KpNYl-nd2iiG0qLIRRdVrmF8SM/) и затем нажимаю Кнопка "Подтвердить", я перенаправлен на страницу по умолчанию / счета / профиль вместо домашней страницы, как указано EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL.
Этот параметр также не оказывает никакого влияния:
ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION = False
Я хочу отключить его, потому что логин не работает - токен недействителен. Возможно, Аллах входит в систему по-другому, чтобы отдохнуть-аутентификации? Я не против, если пользователь должен войти в систему после проверки своего адреса электронной почты, но текущее поведение, которое пользователь, кажется, вошел в систему, но не, не в порядке.
Что я делаю не так, как я могу настроить направление перенаправления пользователя после подтверждения его адреса электронной почты? Большое спасибо за любую помощь!
1 ответ
После долгих раздумий, я думаю, настройки Аллаута не работают так, как я ожидал от их имен, и, возможно, не работают так, как задумано. ACCOUNT_EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL не означает "перенаправление после входа пользователя". Код тестирует user.is_authenticated (site-packages/allauth/account/adapter.py), что в данном контексте, по-видимому, означает "была ли ссылка подтверждения действительной?".
ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION, кажется, не работает вообще с аутентификацией токена, и в любом случае, как известно, не работает, если сессия изменилась. Поэтому я думаю, что это должно быть установлено в False.
ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION = Ложь иногда кажется честью, но не всегда, и я не выяснил, почему...
Глядя на то, как построен шаблон email_confirm.html, я думаю, что успех всегда перенаправит вас на ACCOUNT_EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL, а неудача удержит вас на странице с нерабочей ссылкой, чтобы запросить новое подтверждение по электронной почте.
Я не могу найти, когда будет использоваться ACCOUNT_EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL, но установил его на домашней странице.
Возможно, я неправильно понял это, но у меня наконец-то есть какая-то рабочая установка. Это очень грязно, должен быть лучший способ сделать это, но сейчас я возьму все, что позволит мне двигаться дальше. В итоге я использовал несколько шаблонов allauth для управления учетными записями, потому что я не могу заставить это работать с rest-auth.
Существует проблема с ошибочными ссылками: в основном я вижу страницу шаблона с ее полезным сообщением, но иногда она просто показывает домашнюю страницу. Но, по крайней мере, это не основной поток и не катастрофа для пользователя.
settings.py: обратите внимание на запись шаблона DIRS для allauth, в противном случае мой пользовательский шаблон не используется
TEMPLATES = [
{
...
'DIRS': [os.path.join(BASE_DIR, 'templates'),
os.path.join(BASE_DIR, 'assets'),
os.path.join(BASE_DIR, 'templates', 'allauth')],
...
]
ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION = False
ACCOUNT_EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL = '/'
ACCOUNT_EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL = '/verified'
"подтвержден" - это маршрут в моем интерфейсе, который отображает подтверждающее сообщение и ссылку для входа в систему.
urls.py
from django.views.generic import TemplateView
urlpatterns = [
...
re_path(r'^rest-auth/registration/account-confirm-email/(?P<key>[-:\w]+)/$', confirm_email,
name='account_confirm_email'),
]
templates / account / email_confirm.html, модифицированный, чтобы дать рабочую ссылку при сбое
{% extends "account/base.html" %}
{% load i18n %}
{% load account %}
{% block head_title %}{% trans "Confirm E-mail Address" %}{% endblock %}
{% block content %}
<h1>{% trans "Confirm E-mail Address" %}</h1>
{% if confirmation %}
{% user_display confirmation.email_address.user as user_display %}
<p>{% blocktrans with confirmation.email_address.email as email %}Please confirm that <a href="mailto:{{ email }}">{{ email }}</a> is an e-mail address for user {{ user_display }}.{% endblocktrans %}</p>
<form method="post" action="{% url 'account_confirm_email' confirmation.key %}">
{% csrf_token %}
<button type="submit">{% trans 'Confirm' %}</button>
</form>
{% else %}
{% url 'account_email' as email_url %}
<p>{% blocktrans %}The email confirmation link expired or is invalid. Please <a href="/login/">login</a> and request a new confirmation email from your user account.{% endblocktrans %}</p>
{% endif %}
{% endblock %}