更改 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 应用程序,注册用户会发生啥情况?