django allauth设置EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL不起作用

时间:2019-02-01 13:23:35

标签: django django-rest-framework email-validation allauth

在尝试通过单击确认电子邮件中的链接确认用户的电子邮件地址后,我尝试更改将用户重定向到的位置。

我正在将Django 2.0.10与allauth,rest-auth和rest-framework一起使用。对于电子邮件验证,我使用默认的allauth视图。

在我的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/)的链接,然后单击“确认”按钮时,我将重定向到默认页面/ accounts / profile,而不是EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL指定的主页。 / p>

此设置似乎也没有任何作用:

ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION =假

我想禁用它,因为登录无效-令牌无效。也许allauth登录到rest-auth的方式不同?我不介意用户在验证其电子邮件地址后是否必须登录,但是该用户当前似乎已登录但不是这样的当前行为并不正常。

我在做什么错,在确认用户的电子邮件地址后,如何自定义用户的重定向位置?非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

经过一番摆弄之后,我认为allauth设置不符合我对它们名称的期望,并且可能无法按预期工作。 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:请注意allauth的模板DIRS条目,否则不使用我的自定义模板

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 %}