Ich gehe davon aus, dass Sie derzeit die integrierte Anmeldeansicht mit verwenden
(r'^accounts/login/$', 'django.contrib.auth.views.login'),
oder etwas ähnliches in deinen URLs.
Sie können Ihre eigene Anmeldeansicht schreiben, die die Standardansicht umschließt. Es wird überprüft, ob der Benutzer bereits angemeldet ist, und umgeleitet, falls dies der Fall ist. Andernfalls wird die Standardansicht verwendet.
etwas wie:
from django.contrib.auth.views import login
def custom_login(request):
if request.user.is_authenticated():
return HttpResponseRedirect(...)
else:
return login(request)
und natürlich ändern Sie Ihre URLs entsprechend:
(r'^accounts/login/$', custom_login),
custom_login
mit einem zweiten Argument deklarieren**kwargs
, damit alle Argumente, die Sie nicht interessieren, an die integriertelogin
Ansicht übergeben werden.LOGIN_URL
vonuser_passes_test
(und damitpermission_required
) Dekorateuren weitergeleitet werden, wenn er nicht über die erforderlichen Berechtigungen verfügt, um auf eine bestimmte Ansicht zuzugreifen.login(request, template_name = 'user/login.html')
Der Django 1.10 Weg
Für Django 1.10, das im August 2016 veröffentlicht wurde,
redirect_authenticated_user
wurde derlogin()
funktionsbasierten Ansicht indjango.contrib.auth
[1] ein neuer Parameter mit dem Namen hinzugefügt .Beispiel
Angenommen, wir haben eine Django-Anwendung mit einer Datei mit dem Namen
views.py
und einer anderen Datei mit dem Namenurls.py
. Dieurls.py
Datei enthält folgenden Python-Code:# # 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'), ]
Aus dieser Datei ist der relevante Teil innerhalb der
urlpatterns
Variablendefinition der folgende, der den bereits erwähntenredirect_authenticated_user
Parameter mit einemTrue
Wert verwendet:url(r'^login/', auth_views.login, name='login', kwargs={'redirect_authenticated_user': True}),
Beachten Sie, dass der Standardwert des
redirect_authenticated_user
Parameters istFalse
.Der Django 1.11 Weg
Für Django 1.11, das im April 2017 veröffentlicht wurde, hat die
LoginView
klassenbasierte Ansicht dielogin()
funktionsbasierte Ansicht [2] abgelöst, sodass Sie zwischen zwei Optionen wählen können:python -Wd manage.py runserver
in Ihrem Django-Projektverzeichnis ausführen und dann mit einem Webbrowser zu Ihrer Anmeldeseite wechseln, wird in demselben Konsolenterminal eine Warnmeldung wie die folgende angezeigt:Django 1.11 way
, um Ihren Code moderner und kompatibler mit zukünftigen Django-Versionen zu machen. Mit dieser Option sieht das zuvor angegebene Beispiel nun wie folgt aus:Beispiel
Wir nehmen wieder an, dass wir eine Django-Anwendung mit einer Datei namens
views.py
und einer anderen Datei namens habenurls.py
. Dieurls.py
Datei enthält folgenden Python-Code:# # 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'), ]
Aus dieser Datei ist der relevante Teil innerhalb der
urlpatterns
Variablendefinition der folgende, der wiederum den bereits erwähntenredirect_authenticated_user
Parameter mit einemTrue
Wert verwendet, ihn jedoch als Argument an dieas_view
Methode derLoginView
Klasse übergibt :url(r'^login/', auth_views.LoginView.as_view(redirect_authenticated_user=False), name='login'),
Beachten Sie, dass hier auch der Standardwert des
redirect_authenticated_user
Parameters istFalse
.Verweise
quelle
anonym_erforderlicher Dekorateur
Für klassenbasierte Ansichten
Code:
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
Verwendung:
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
Für Ansichtsfunktionen
Von http://blog.motane.lu/2010/01/06/django-anonymous_required-decorator/
Code:
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 )
Verwendung:
@anonymous_required def my_view( request ): return render_to_response( 'my-view.html' )
quelle
dispatch()
. Siehe Django-Klammern für viele Beispiele.Für Django 2.x in Ihrer 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'), ]
quelle
Fügen Sie diesen Dekorator über Ihrer Anmeldeansicht hinzu, um zu / home umzuleiten, wenn ein Benutzer bereits angemeldet ist
@user_passes_test(lambda user: not user.username, login_url='/home', redirect_field_name=None)
und vergessen Sie nicht, den Dekorateur zu importieren
from django.contrib.auth.decorators import user_passes_test
quelle
user.is_anonymous()
ist möglicherweise besser als das Testen des Benutzernamens.next
GET-Variable codiert .Schon seit klassenbasierte Ansichten (CBVs) auf dem Vormarsch sind. Mit diesem Ansatz können Sie zu einer anderen URL umleiten, wenn Sie nur für nicht authentifizierte Benutzer auf die Ansicht zugreifen.
In meinem Beispiel die Anmelde- zwingende Seite die
dispatch()
Methode.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)
Prost!
quelle
Ich weiß, dass dies eine ziemlich alte Frage ist, aber ich werde meine Technik hinzufügen, falls jemand anderes sie benötigt:
myproject / myapp / views / 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'), ) ...
quelle
Angenommen, Sie sind mit dem Einrichten der integrierten Django-Benutzerauthentifizierung (und der Verwendung von Dekoratoren) fertig, fügen Sie dies in Ihrer settings.py hinzu:
LOGIN_REDIRECT_URL = '/welcome/'
HINWEIS: '/ welcome /' hier ist die URL der Homepage. Es liegt an Ihnen, durch was Sie es ersetzen möchten.
quelle
Alles was Sie tun müssen, ist die "root" URL auf die Homepage Ansicht zu setzen. Da die Startseitenansicht für angemeldete Benutzer bereits eingeschränkt ist, werden anonyme Benutzer automatisch auf die Anmeldeseite umgeleitet.
Kepp die URL wie sie ist. Und füge etwas hinzu wie:
(r'^$', 'my_project.my_app.views.homepage'),
quelle
login
Ansicht deckt diesen Fall nicht ab.