Django:从登录页面重定向登录用户

时间:2010-02-23 18:09:40

标签: django

我想设置我的网站,以便在用户点击/login页面并且他们已经登录时,它会将其重定向到主页。如果他们没有登录,那么它将正常显示。我怎么能这样做,因为登录代码内置在Django中?

10 个答案:

答案 0 :(得分:73)

我假设您当前正在使用内置登录视图,

(r'^accounts/login/$', 'django.contrib.auth.views.login'),

或您网址中的类似内容。

您可以编写自己的登录视图来包装默认视图。它将检查用户是否已登录并重定向,如果是,则使用默认视图。

类似的东西:

from django.contrib.auth.views import login

def custom_login(request):
    if request.user.is_authenticated():
        return HttpResponseRedirect(...)
    else:
        return login(request)

当然会相应更改您的网址:

(r'^accounts/login/$', custom_login),

答案 1 :(得分:53)

Django 1.10方式

对于2016年8月发布的Django 1.10,redirect_authenticated_user [1]中存在的基于login()函数的视图中添加了一个名为django.contrib.auth的新参数。

实施例

假设我们有一个名为views.py的文件的Django应用程序和另一个名为urls.py的文件。 urls.py文件将包含一些Python代码:

#
# Django 1.10 way
#
from django.contrib.auth import views as auth_views
from . import views as app_views


urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/', auth_views.login, name='login',
        kwargs={'redirect_authenticated_user': True}),
    url(r'^dashboard/', app_views.Dashboard.as_view(), name='dashboard'),
    url(r'^$', TemplateView.as_view(template_name='index.html'), name='index'),
]

从该文件中,urlpatterns变量定义中的相关部分如下,它使用已提及的redirect_authenticated_user参数和True值:

    url(r'^login/', auth_views.login, name='login',
        kwargs={'redirect_authenticated_user': True}),

请注意redirect_authenticated_user参数的默认值为False

Django 1.11方式

对于2017年4月发布的Django 1.11,LoginView基于类的视图取代了login()基于函数的视图[2],它为您提供了两个选项供您选择:

  • 使用之前描述的相同 Django 1.10方式,这是一件好事,因为您当前的代码将继续正常工作。如果您告诉Python解释器显示警告,例如在控制台终端中运行Django项目目录中的命令python -Wd manage.py runserver,然后使用Web浏览器访问您的登录页面,您将在同一个控制台终端中看到像这样的警告信息:
  

/usr/local/lib/python3.6/site-packages/django/contrib/auth/views.py:54:   RemovedInDjango21Warning:login()视图被取代   基于类的LoginView()。

  • 使用新的Django 1.11 way,这将使您的代码更加现代化,并与未来的Django版本兼容。使用此选项,之前给出的示例现在将如下所示:

实施例

我们再次假设我们有一个名为views.py的文件和另一个名为urls.py的文件的Django应用程序。 urls.py文件将包含一些Python代码:

#
# Django 1.11 way
#
from django.contrib.auth import views as auth_views
from . import views as app_views


urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/',
        auth_views.LoginView.as_view(redirect_authenticated_user=True),
        name='login'),
    url(r'^dashboard/', app_views.Dashboard.as_view(), name='dashboard'),
    url(r'^$', TemplateView.as_view(template_name='index.html'), name='index'),
]

从该文件中,urlpatterns变量定义中的相关部分如下,它再次使用已提到的redirect_authenticated_user参数和True值,但将其作为参数传递到as_view类的LoginView方法:

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

请注意,redirect_authenticated_user参数的默认值也是False

参考

答案 2 :(得分:22)

anonymous_required decorator

对于基于类的视图

<强>代码:

from django.shortcuts import redirect

def anonymous_required(func):
    def as_view(request, *args, **kwargs):
        redirect_to = kwargs.get('next', settings.LOGIN_REDIRECT_URL )
        if request.user.is_authenticated():
            return redirect(redirect_to)
        response = func(request, *args, **kwargs)
        return response
    return as_view

<强>用法:

url(r'^/?$',
   anonymous_required(auth_views.login),
),
url(r'^register/?$',
    anonymous_required(RegistrationView.as_view()),
    name='auth.views.register'
),
# Could be used to decorate the dispatch function of the view instead of the url

用于查看功能

来自http://blog.motane.lu/2010/01/06/django-anonymous_required-decorator/

<强>代码:

from django.http import HttpResponseRedirect

def anonymous_required( view_function, redirect_to = None ):
    return AnonymousRequired( view_function, redirect_to )

class AnonymousRequired( object ):
    def __init__( self, view_function, redirect_to ):
        if redirect_to is None:
            from django.conf import settings
            redirect_to = settings.LOGIN_REDIRECT_URL
        self.view_function = view_function
        self.redirect_to = redirect_to

    def __call__( self, request, *args, **kwargs ):
        if request.user is not None and request.user.is_authenticated():
            return HttpResponseRedirect( self.redirect_to )
        return self.view_function( request, *args, **kwargs )

<强>用法:

@anonymous_required
def my_view( request ):
    return render_to_response( 'my-view.html' )

答案 3 :(得分:9)

如果用户已登录

,请在登录视图上方添加此装饰器以重定向到/ home

@user_passes_test(lambda user: not user.username, login_url='/home', redirect_field_name=None)

并且不要忘记导入装饰器

from django.contrib.auth.decorators import user_passes_test

答案 4 :(得分:5)

由于基于类的视图(CBV)正在上升。此方法将帮助您在仅为未经过身份验证的用户访问视图时重定向到另一个URL。

在我的示例中,注册页面覆盖了dispatch()方法。

class Signup(CreateView):
    template_name = 'sign-up.html'

    def dispatch(self, *args, **kwargs):
        if self.request.user.is_authenticated:
            return redirect('path/to/desired/url')
        return super().dispatch(*args, **kwargs)

干杯!

答案 5 :(得分:4)

对于Django 2.x,在您的urls.py中:

from django.contrib.auth import views as auth_views
from django.urls import path

urlpatterns = [
    path('login/', auth_views.LoginView.as_view(redirect_authenticated_user=True), name='login'),
]

答案 6 :(得分:3)

我知道这是一个非常古老的问题,但我会添加我的技术以防其他人需要它:


<强>的myproject / MyApp的/视图/ misc.py

from django.contrib.auth.views import login as contrib_login, logout as contrib_logout
from django.shortcuts import redirect
from django.conf import settings


def login(request, **kwargs):
    if request.user.is_authenticated():
        return redirect(settings.LOGIN_REDIRECT_URL)
    else:
        return contrib_login(request, **kwargs)

logout = contrib_logout

<强>的myproject / MyApp的/ urls.py

from django.conf.urls import patterns, url

urlpatterns = patterns('myapp.views.misc',
    url(r'^login/$', 'login', {'template_name': 'myapp/login.html'}, name='login'),
    url(r'^logout/$', 'logout', {'template_name': 'myapp/logout.html'}, name='logout'),
)
...

答案 7 :(得分:2)

https://docs.djangoproject.com/en/3.1/topics/auth/default/#all-authentication-views

在设置中添加重定向路由

LOGIN_URL = 'login'

并在 URL 中添加 redirect_authenticated_user=True 到 LoginView

path('login/', auth_views.LoginView.as_view(template_name='users/login.html',redirect_authenticated_user=True), name='login')

答案 8 :(得分:-1)

假设您已完成设置内置Django用户身份验证(并使用装饰器),请在settings.py中添加:

LOGIN_REDIRECT_URL = '/welcome/'

注意:'/ welcome /'这里是主页的URL。由你来取代它取决于它。

答案 9 :(得分:-6)

您所要做的就是将“root”网址设置为首页视图。由于已登录用户的主页视图已受限制,因此它会自动将匿名用户重定向到登录页面。

按原样加密网址。 并添加如下内容:

(r'^$', 'my_project.my_app.views.homepage'),