更改 URL 中的顺序(身份验证/注册)导致的不同模板使用

Posted

技术标签:

【中文标题】更改 URL 中的顺序(身份验证/注册)导致的不同模板使用【英文标题】:Different templates usage caused by changing the order in URLs (auth / registration) 【发布时间】:2016-05-16 08:23:36 【问题描述】:

我在我的项目中使用built-in auth tools 和 django-registration

我的注销模板位于:

/accounts/templates/registration/logout.html

如果 urls.py 看起来像:

urlpatterns = [
...
url(regex = r'^accounts/', view = include('registration.backends.hmac.urls')),
url(regex = r'^accounts/', view = include('django.contrib.auth.urls')),
...
]

它使用我的模板。没关系。

但是如果我像这样重新组织网址:

 urlpatterns = [
...
url(regex = r'^accounts/', view = include('django.contrib.auth.urls')),
url(regex = r'^accounts/', view = include('registration.backends.hmac.urls')),
...
]

它使用内置的管理员注销模板。

为什么会这样?

编辑

在their tutorial 我看到他们说'registration.backends.hmac.urls':

那个 URLconf 还设置了来自 django.contrib.auth 的视图(登录, 注销、密码重置等),但如果您想要这些视图 不同的位置,您可以包含() URLconf registration.auth_urls 仅将 django.contrib.auth 视图放置在 URL 层次结构中的特定位置。

但是当我打开它时,它似乎与 auth urls/views 无关: 编辑:好的,现在我明白了。

"""
URLconf for registration and activation, using django-registration's
HMAC activation workflow.

"""

from django.conf.urls import include, url
from django.views.generic.base import TemplateView
from .views import ActivationView, RegistrationView


urlpatterns = [
url(r'^activate/complete/$',
    TemplateView.as_view(
        template_name='registration/activation_complete.html'
    ),
    name='registration_activation_complete'),
# The activation key can make use of any character from the
# URL-safe base64 alphabet, plus the colon as a separator.
url(r'^activate/(?P<activation_key>[-:\w]+)/$',
    ActivationView.as_view(),
    name='registration_activate'),
url(r'^register/$',
    RegistrationView.as_view(),
    name='registration_register'),
url(r'^register/complete/$',
    TemplateView.as_view(
        template_name='registration/registration_complete.html'
    ),
    name='registration_complete'),
url(r'^register/closed/$',
    TemplateView.as_view(
        template_name='registration/registration_closed.html'
    ),
    name='registration_disallowed'),
url(r'', include('registration.auth_urls')),

]

【问题讨论】:

内置身份验证支持应该是 'django.contrib.auth' 在您的 INSTALLED_APPS 中, 是的,我正在使用它。但我想知道,为什么注册会干扰它,尽管我使用的 urls.py 与 django.contrib.auth 没有任何(对我而言)可见的连接。上面写着,如果你使用 django-registration,你不必单独添加 aut.contrib,因为注册已经链接了它。当我从 urls 中删除 django.contrib.auth.urls 时,所有测试都失败了。所以它没有链接。 嗯,他们确实有连接哪个 django 用户模型用于他们的身份验证 【参考方案1】:

registration.backends.hmac.urls中的last url pattern包含registration.auth_urls,提供登录、注销等url。

url(r'', include('registration.auth_urls')),

如果您在 hmac url 上方包含 django.contrib.auth.urls,则将使用来自 django.contrib.auth 的注销视图。此视图uses a different template,registration/logged_out.html。由于您没有覆盖它,因此使用了管理模板。

【讨论】:

好吧,我一定是瞎了,我没有注意到这条线。谢谢【参考方案2】:

将 url 映射到视图的 django url dipatcher 按从头到尾的顺序检查 url:

Django 依次遍历每个 URL 模式,并在第一个停止 与请求的 URL 匹配的一个。

因此,相似 url 的顺序决定了匹配哪个 url。 IE。第一个匹配。

【讨论】:

以上是关于更改 URL 中的顺序(身份验证/注册)导致的不同模板使用的主要内容,如果未能解决你的问题,请参考以下文章

我们可以将输入的用户名传递给spring security中的身份验证失败url吗?

如果我更改我的 web 应用程序用于身份验证的 Active Directory 应用程序,注册用户会发生啥情况?

注册新帐户时如何要求 asp.net forms 身份验证发送验证电子邮件?

根据动态字段更改 url

身份证件号的验证与更改

Firebase 身份验证 UI - 登录与注册