code

Django : 로그인 페이지에서 로그인 한 사용자 리디렉션

codestyles 2020. 11. 26. 08:17
반응형

Django : 로그인 페이지에서 로그인 한 사용자 리디렉션


사용자가 /login페이지를 방문하고 이미 로그인되어있는 경우 홈페이지로 리디렉션 되도록 사이트를 설정하고 싶습니다 . 로그인하지 않은 경우 정상적으로 표시됩니다. 로그인 코드가 Django에 내장되어 있기 때문에 어떻게해야합니까?


현재 기본 제공 로그인보기를 사용하고 있다고 가정합니다.

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

또는 URL에서 비슷한 것.

기본 로그인보기를 래핑하는 고유 한 로그인보기를 작성할 수 있습니다. 사용자가 이미 로그인되어 있는지 확인하고 로그인 한 경우 리디렉션하고 그렇지 않으면 기본보기를 사용합니다.

같은 것 :

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

장고 1.10 방식

2016 년 8 월에 출시 된 Django 1.10의 경우 [1] redirect_authenticated_user있는 login()함수 기반 뷰에 이름 지정된 새 매개 변수 가 추가되었습니다 django.contrib.auth.

파일 이름이 .txt views.py이고 다른 파일 이있는 Django 애플리케이션이 있다고 가정 합니다 urls.py. urls.py파일은 다음과 같은 몇 가지 파이썬 코드를 포함합니다 :

#
# 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입니다.

장고 1.11 방식

2017 년 4 월에 출시 된 Django 1.11의 경우 LoginView클래스 기반 뷰가 login()함수 기반 뷰 [2]를 대체하여 선택할 수있는 두 가지 옵션을 제공합니다.

  • 이전에 설명한 것과 동일한 Django 1.10 방식을 사용 하십시오. 현재 코드가 계속 정상적으로 작동하기 때문에 긍정적입니다. 예를 들어 콘솔 터미널에서 python -Wd manage.py runserverDjango 프로젝트 디렉토리 의 명령을 실행 한 다음 웹 브라우저를 사용하여 로그인 페이지로 이동하여 Python 인터프리터에 경고를 표시 하도록 지시하면 동일한 콘솔 터미널에서 다음과 같은 경고 메시지를 볼 수 있습니다.

/usr/local/lib/python3.6/site-packages/django/contrib/auth/views.py:54 : RemovedInDjango21Warning : login () 뷰는 클래스 기반 LoginView ()로 대체됩니다.

  • new를 사용하면 Django 1.11 way코드가 더 현대적이고 향후 Django 릴리스와 호환됩니다. 이 옵션을 사용하면 이전에 제공된 예제는 이제 다음과 같습니다.

다시 한 번 이름이라는 파일 views.py과 다른 파일 이있는 Django 애플리케이션이 있다고 가정합니다 urls.py. urls.py파일은 다음과 같은 몇 가지 파이썬 코드를 포함합니다 :

#
# 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입니다.

참고 문헌


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

보기 기능

에서 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' )

사용자가 이미 로그인 한 경우 / 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'),
]

클래스 기반 뷰 (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)

건배!


I know this is a pretty old question, but I'll add my technique in case anyone else needs it:


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

Assuming that you are done setting up built-in Django user authentication (and using decorators), add this in your settings.py:

LOGIN_REDIRECT_URL = '/welcome/'

NOTE: '/welcome/' here is the URL of the homepage. It is up to you what to replace it with.


All you have to do is set the "root" url to the homepage view. Since the homepage view is already restricted for logged on users, it'll automatically redirect anonymous users to the login page.

Kepp the url as it is. And add something like:

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

참고URL : https://stackoverflow.com/questions/2320581/django-redirect-logged-in-users-from-login-page

반응형