django allauth 设置 EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL 不起作用

Posted

技术标签:

【中文标题】django allauth 设置 EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL 不起作用【英文标题】:django allauth setting EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL doesn't work 【发布时间】:2019-06-26 02:05:18 【问题描述】:

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

我正在使用带有 allauth、rest-auth 和 rest-framework 的 Django 2.0.10。对于电子邮件验证,我使用的是默认的 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 指定的主页。

这个设置似乎也没有任何效果:

ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION = 假

我想禁用它,因为登录不起作用 - 令牌无效。也许 allauth 的登录方式与 rest-auth 不同?我不介意用户在验证他们的电子邮件地址后是否必须登录,但是用户似乎已登录但实际上没有登录的当前行为是不行的。

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

【问题讨论】:

【参考方案1】:

经过大量的摆弄,我认为 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 = False 似乎有时会受到尊重,但并非总是如此,我还没有找到原因...

看看 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'

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

【讨论】:

请您分享一下您是如何处理过期电子邮件的?我已经为此奋斗了几个星期 请您分享一下您是如何处理过期电子邮件的?我已经为此奋斗了几个星期 你的意思是如果用户第二次点击邮件,那么它就不起作用了?该页面显示错误,用户可以请求发送一封带有新链接的新电子邮件。

以上是关于django allauth 设置 EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

django allauth 设置 EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL 不起作用

自定义 django-allauth 登录视图

django-rest-auth + django-allauth + angular2

Django从零搭建个人博客 | 使用allauth插件管理用户登录与注册

使用 django-allauth 登录信号将用户重定向到另一个 url

Django 使用allauth报错 RuntimeError: Model class django.contrib.sites.models.Site doesn't declare an