Django:从login页面redirectlogin用户

我想设置我的网站,以便如果用户点击/login页面,他们已经login,它将redirect到主页。 如果他们没有login,那么它将正常显示。 我怎样才能做到这一点,因为login代码内置到Django?

我假设你目前正在使用内置的login视图

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

或在你的url类似的东西。

您可以编写自己的login视图,包装默认的视图。 它将检查用户是否已经login并redirect(如果他是),否则使用默认视图。

就像是:

 from django.contrib.auth.views import login def custom_login(request): if request.user.is_authenticated(): return HttpResponseRedirect(...) else: return login(request) 

当然也可以改变你的url

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

Django 1.10的方式

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

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

 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'), ] 

从该文件中, urlpatternsvariables定义中的相关部分如下,它使用已经提到的具有True值的redirect_authenticated_user参数:

  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],该视图为您提供了两个选项供您select:

  • 使用刚刚描述的相同的Django 1.10方式 ,这是一个积极的事情,因为你当前的代码将继续正常工作。 如果你告诉Python解释器显示警告,例如通过在控制台terminal中运行你的Django项目目录下的python -Wd manage.py runserver ,然后用web浏览器到你的login页面,你会看到在同一个控制台terminal这样的警告消息:

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

  • 使用新的Django 1.1 way ,这将使您的代码更加现代化,并与未来的Django版本兼容。 有了这个选项,以前给出的例子将如下所示:

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

 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'), ] 

从该文件中, urlpatternsvariables定义中的相关部分如下,它再次使用已经提到的带有True值的redirect_authenticated_user参数,但将其作为parameter passing给LoginView类的as_view方法:

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

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

参考

anonymous_required装饰器

对于基于类的视图

码:

 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 

查看function

来自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' ) 

如果用户已经login,则将此装饰器添加到您的login视图上以redirect到/ 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

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


的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'), ) ... 

假设你已经完成了设置内置的Django用户authentication(并使用装饰器),在settings.py中添加这个:

LOGIN_REDIRECT_URL = '/welcome/'

注意:“/ welcome /”是主页的URL。 这取决于你用什么来取代它。

您只需将“根”url设置为首页视图即可。 由于主页视图已经被login用户限制,它会自动将匿名用户redirect到login页面。

Kepp的url,因为它是。 并添加如下内容:

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