62 django
我想设置我的网站,以便在用户点击/login页面并且他们已经登录时,它会将它们重定向到主页.如果他们没有登录,那么它将正常显示.我怎么能这样做,因为登录代码内置在Django中?
Ofr*_*viv 76
我假设您当前正在使用内置登录视图
(r'^accounts/login/$', 'django.contrib.auth.views.login'),
Run Code Online (Sandbox Code Playgroud)
或者你网址中的类似内容.
您可以编写自己的登录视图来包装默认视图.它将检查用户是否已登录并重定向(如果是),否则使用默认视图.
就像是:
from django.contrib.auth.views import login
def custom_login(request):
if request.user.is_authenticated():
return HttpResponseRedirect(...)
else:
return login(request)
Run Code Online (Sandbox Code Playgroud)
当然会相应地更改您的网址:
(r'^accounts/login/$', custom_login),
Run Code Online (Sandbox Code Playgroud)
rod*_*jcj 55
对于2016年8月发布的Django 1.10,在[1]中出现的基于函数的视图中redirect_authenticated_user添加了一个名为的新参数.login()django.contrib.auth
假设我们有一个Django应用程序,其中包含一个名为的文件views.py和另一个名为的文件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'),
]
Run Code Online (Sandbox Code Playgroud)
从该文件中,urlpatterns变量定义中的相关部分如下,它使用已提到的redirect_authenticated_user参数和True值:
url(r'^login/', auth_views.login, name='login',
kwargs={'redirect_authenticated_user': True}),
Run Code Online (Sandbox Code Playgroud)
请注意redirect_authenticated_user参数的默认值是False.
对于2017年4月发布的Django 1.11,LoginView基于类的视图取代了login()基于函数的视图[2],它提供了两个选项供您选择:
python -Wd manage.py runserverDjango项目目录中的命令,然后使用Web浏览器访问登录页面,您将在同一控制台终端中看到如下警告消息:/usr/local/lib/python3.6/site-packages/django/contrib/auth/views.py:54:ReaddInDjango21Warning:login()视图被基于类的LoginView()取代.
Django 1.11 way,这将使您的代码更加现代化,并与未来的Django版本兼容.使用此选项,之前给出的示例现在将如下所示:我们再次假设我们有一个Django应用程序,其中包含一个名为的文件views.py和另一个名为的文件urls.py.该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'),
]
Run Code Online (Sandbox Code Playgroud)
从该文件中,urlpatterns变量定义中的相关部分如下所示,它再次使用已提到的redirect_authenticated_user带有True值的参数,但将其作为参数传递给类的as_view方法LoginView:
url(r'^login/',
auth_views.LoginView.as_view(redirect_authenticated_user=False),
name='login'),
Run Code Online (Sandbox Code Playgroud)
请注意,此处redirect_authenticated_user参数的默认值也是False.
laf*_*ste 23
码:
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
Run Code Online (Sandbox Code Playgroud)
用法:
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
Run Code Online (Sandbox Code Playgroud)
来自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 )
Run Code Online (Sandbox Code Playgroud)
用法:
@anonymous_required
def my_view( request ):
return render_to_response( 'my-view.html' )
Run Code Online (Sandbox Code Playgroud)
小智 10
https://docs.djangoproject.com/en/3.1/topics/auth/default/#all-authentication-views
在设置中添加重定向路由
LOGIN_URL = 'login'
Run Code Online (Sandbox Code Playgroud)
并在 URL 中添加redirect_authenticated_user=True 到 LoginView
path('login/', auth_views.LoginView.as_view(template_name='users/login.html',redirect_authenticated_user=True), name='login')
Run Code Online (Sandbox Code Playgroud)
如果用户已经登录,请在登录视图上方添加此装饰器以重定向到/ 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
对于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'),
]
Run Code Online (Sandbox Code Playgroud)
由于基于类的视图(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)
Run Code Online (Sandbox Code Playgroud)
干杯!
| 归档时间: |
|
| 查看次数: |
39742 次 |
| 最近记录: |