django中的自定义登录URL

Posted

技术标签:

【中文标题】django中的自定义登录URL【英文标题】:Custom login URL in django 【发布时间】:2018-09-07 00:46:59 【问题描述】:

我是 django 的新手,我正在研究 Django 中的不同选项。我创建了一个基于类的视图,它需要用户身份验证才能查看网页。我正在使用内置的 LoginView。

当url模式指定如下时

url(r'^login/', auth_views.LoginView.as_view(),name='login'),

已正确重定向到登录页面。

但是当我给予时

url(r'^restaurant/login/', auth_views.LoginView.as_view(),name='login'),

我在尝试访问需要用户身份验证的页面时收到 404。 但是当我在浏览器中手动转到该 url 时,它工作得非常好。 这是为什么?这两种情况都不应该有效吗?

【问题讨论】:

请注意,除了使用include() 时,您的正则表达式应以美元结尾(例如r'^login/$'r'^restaurant/login/$')。否则,URL 模式将匹配 /restaurant/login/,但也匹配 /restaurant/login/something-else/ 【参考方案1】:

不确定我是否完全理解你的问题,试着给出一个愚蠢的答案。

Django 2.1.7

    在设置中使用命名空间和 URL 名称,如果您有自己的登录视图,只需将 admin 更改为您的 url 命名空间并将您的视图命名为“登录”
# settings.py
LOGIN_URL = 'admin:login'
    然后login_required 装饰器将引导您正确的登录页面。
from django.contrib.auth.decorators import login_required

@login_required()
def month_archive(request, year, month):
    production_list = Production.objects.month_archive(year, month)
    context = 'production_list': production_list
    return TemplateResponse(request, 'production/production_list.html', context)
    如果是基于类的视图,请将装饰器添加到 urls.py
from django.contrib.auth.decorators import login_required

urlpatterns = [
    path('', login_required(views.ProductionList.as_view()), name='production-list'),
    path('<int:year>/<int:month>/', views.month_archive, name='production-month'),
]

【讨论】:

对于基于类的视图,官方的做法是使用LoginRequiredMixin。【参考方案2】:

听起来您需要在设置中设置LOGIN_URL

LOGIN_URL = '/restaurant/login/'

或者,最好使用 URL 模式名称,这样您就不必在更改登录 URL 时更新设置

LOGIN_URL = 'login'

【讨论】:

难道 django 不是在寻找 url 的 name 参数中指定的 'login' 然后将其反转为 'restaurant/login' 吗? 我不确定我是否理解您的评论。默认情况下,login_required 重定向到 settings.LOGIN_URL。但是默认为/accounts/login/,默认情况下不会反转。

以上是关于django中的自定义登录URL的主要内容,如果未能解决你的问题,请参考以下文章

Django 中的自定义 url 模式

ASP.NET Mvc 站点中登录用户的自定义目录

如何将 is_staff 用户重定向到 Django 中的自定义模板?

如何使用 django-filters 过滤 ModelViewSet 中的自定义 url

Wordpress的自定义登录页更改

从 django 中的自定义数据库表中检查电子邮件和密码