본문 바로가기
Django

[Django] 장고 로그인 필요 기능과 로그아웃 만들기 #####

by kming 2023. 5. 25.

로그 아웃을 하려면 로그아웃 후에 이동 할 화면과 로그인 후 이동 할 화면이 나뉘어야해요! 로그인 후 화면을 만들어 보고, 필요한 기능들을 만들어 보도록 하겠습니다!

 

  • 로그인 필수 기능 적용하기로그인과 관련된 기능은 대표적으로 두 가지가 있습니다!
    1. 로그인 한 사람만 페이지에 접근 가능하게 만들기
    2. 로그인 한 사람은 사용 안 해도 되는 페이지
    1번은 장고의 기능으로 해결 할 것이기 때문에 저와 함께 작성을 해 보려고 하구요!
  • 2번은 tweet앱의 views.py 파일 안에 구현 된 home 함수를 참고해서 작업을 해 보려고 해요!
  • '로그인 필수' 라는 얘기 어디서 많이 들어보셨죠~?? 페이지에 접근 할 수 있는 사람을 '로그인 한 사람' 으로만 제한 하려고 해요!
    1. 로그인 한 사람만 페이지에 접근 가능하게 만들기
    로그인 한 사람만 사용 가능한 페이지는 지금 보고있는 http://127.0.0.1/tweet 페이지가 되겠네요!
    # tweet/views.py
    from django.shortcuts import render, redirect
    
    def tweet(request):
        if request.method == 'GET':  # 요청하는 방식이 GET 방식인지 확인하기
            user = request.user.is_authenticated  # 사용자가 로그인이 되어 있는지 확인하기
            **if user:  # 로그인 한 사용자라면
                return render(request, 'tweet/home.html')
            else:  # 로그인이 되어 있지 않다면 
                return redirect('/sign-in')**
    
    request.user.is_authenticated 라는 기능은 아까 봤었던 기능이죠~? 지금 요청을 보낸 사용자가 로그인이 되어 있는 사용자가 맞는지 알아보는 함수입니다.
  • 그 외의 사용자들은 http://127.0.0.1:8000/sign-in 으로 되돌아가게 됩니다.
  • tweet앱의 views.py를 열어 주시고, 아래의 코드처럼 tweet 함수에 로그인 한 사용자를 판단하는 기능을 추가 해 주세요!
    1. 로그인 한 사람은 사용 안 해도 되는 페이지 기능 만들기
    <aside> 💡 HTTP 요청방식 중, 페이지를 확인하는 방식은 'GET' 입니다! 우리가 수정 해 줄 함수들 중에서 'GET' 요청 방식으로 되어있는 부분만 수정 해 주면 됩니다!로그인 한 사용자만 접근 가능할 수 있도록 만든 위의 방식을 그대로 사용 해 보려고 해요!회원 가입 페이지의 주소는 http://127.0.0.1:8000/sign-up 이고, 로그인 페이지의 주소는 http://127.0.0.1:8000/sign-in 입니다!우선 회원가입 페이지와 연결되는 함수를 수정할게요! sign_up_view 함수를 봐주세요!
    # user/views.py
    
    def sign_up_view(request):
        **if request.method == 'GET':
            user = request.user.is_authenticated # 로그인 된 사용자가 요청하는지 검사
            if user: # 로그인이 되어있다면
                return redirect('/')
            else: # 로그인이 되어있지 않다면
                return render(request, 'user/signup.html')**
        elif request.method == 'POST':
            username = request.POST.get('username', None)
            password = request.POST.get('password', None)
            password2 = request.POST.get('password2', None)
            bio = request.POST.get('bio', None)
    
            if password != password2:
                return render(request, 'user/signup.html')
            else:
                exist_user = get_user_model().objects.filter(username=username)
                if exist_user:
                    return render(request, 'user/signup.html') # 사용자가 존재하기 때문에 사용자를 저장하지 않고 회원가입 페이지를 다시 띄움
                else:
                    UserModel.objects.create_user(username=username, password=password, bio=bio)
                    return redirect('/sign-in') # 회원가입이 완료되었으므로 로그인 페이지로 이동
    
    sign_up_view의 GET 요청 부분에, user = request.user.is_authenticated 코드를 추가해서 사용자가 로그인 된 상태인지 한번 더 확인했습니다.
    # user/views.py
    
    def sign_in_view(request):
        if request.method == 'POST':
            username = request.POST.get('username', None)
            password = request.POST.get('password', None)
    
            me = auth.authenticate(request, username=username, password=password)  # 사용자 불러오기
            if me is not None:  # 저장된 사용자의 패스워드와 입력받은 패스워드 비교
                auth.login(request, me)
                return redirect('/')
            else:
                return redirect('/sign-in')  # 로그인 실패
        **elif request.method == 'GET':
            user = request.user.is_authenticated  # 사용자가 로그인 되어 있는지 검사
            if user:  # 로그인이 되어 있다면
                return redirect('/')
            else:  # 로그인이 되어 있지 않다면
                return render(request, 'user/signin.html')**
    
    마찬가지로 **request.user.is_authenticated** 를 추가해서 페이지를 요청하는 사용자가 로그인 된 상태인지 확인 해 주는 기능을 적용 했습니다.
    • windows : Ctrl + Shift + n
    • macOS : ⌘ + Shift + n
    을 눌러서 시크릿 창을 켜 주시고, http://127.0.0.1:8000/ 으로 접속 해 주세요!
  • 로그인 후, http://127.0.0.1:8000/sign-in혹은 http://127.0.0.1:8000/sign-up페이지로 접속 해 보면 django는 사용자가 로그인 되어 있다고 판단하고 http://127.0.0.1:8000/tweet 페이지를 띄워 줄 것입니다 .
  • 이제 크롬 시크릿 창을 켜서 우리가 만든 기능을 테스트 해 보려고 합니다.
  • 마찬가지로, 로그인 페이지도 수정 해 주도록 하겠습니다! sign_in_view 함수를 수정 해 주세요!
  • 함수를 아래처럼 수정 해 주세요! (굵게 표시 한 부분이 수정 한 부분입니다)
  • user앱의 views.py 에 있는 로그인/회원가입 함수를 수정하려고 해요! user앱의 views.py를 열어주세요!
  • request.user.is_authenticated 기능을 사용해서 로그인 한 사용자가 회원가입과 로그인 페이지로 들어가지 않고 기본 페이지( http://127.0.0.1:8000/)로로) 되돌아 갈 수 있도록 작업을 해 주려고 합니다.
  • </aside>
  • 로그아웃 구현하기로그인 후에 상단에 나오는 '~~님 반갑습니다!' 주변에 로그아웃 기능을 넣어주려고 합니다!
    • 위와 같이 "~~ 님 반갑습니다 " 옆에 로그아웃 버튼이 생깁니다.
    • 로그아웃을 누르면 로그인 페이지로 갑니다.
    위와 같이 구현 해볼게요!user 앱의 views.py를 열어서 아래의 코드를 추가 해 주세요
    • from django.contrib.auth.decorators import login_required 는 views.py 의 가장 상단에 추가 해주세요.
    • logout함수 위에 @login_required 를 추가 해 주세요!
    @login_required 라는 기능은 로그인 한 사용자만 접근 할 수 있게 해 주는 기능입니다! 로그아웃 기능은 로그인 했을 때만 사용 해야 하기 때문에 붙여주었습니다!@login_required는 로그인 하지 않으면 접근이 불가능 하게 만드는 기능이고, request.user.is_authenticated는 로그인의 여부만 검증 해 주는 기능입니다! 두 기능이 비슷하기 때문에 잘 구분 해 주어야 합니다!user앱의 urls.py를 열어서 로그아웃 url을 추가 해 주겠습니다! 아래에 굵게 표시 된 부분을 추가 해 주세요!이제 html의 '로그아웃' 부분을 추가 해 주기 위해서 templates폴더의 base.html을 열어주세요!
    <!-- templates/base.html -->
    
    		... 생략 
    				<li class="nav-item">
                <a class="nav-link" href="#"> 친구 <span class="sr-only"></span></a>
            </li>
        </ul>
    </div>
    <form class="form-inline my-2 my-lg-0">
        **{% if not user.is_authenticated %}**
            <ul class="navbar-nav mr-auto">
                <li class="nav-item active">
                    <a class="nav-link" href="/sign-in"> Sign In <span class="sr-only"></span></a>
                </li>
                <li class="nav-item active">
                    <a class="nav-link" href="/sign-up"> Sign Up <span class="sr-only"></span></a>
                </li>
            </ul>
        **{% else %}
            <ul class="navbar-nav mr-auto">
                <li class="nav-item" disabled>
                    <span class="nav-link">
                        {{ user.username }} 님 반갑습니다!
                    </span>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="/logout"> 로그아웃 </a>
                </li>
            </ul>
        {% endif %}**
    </form>
    
    ****... 생략
    
    여기에서 모두 기억 하지 않아도 됩니다!! <a class="nav-link" href="/logout"> 로그아웃 </a> 부분이 우리의 로그아웃을 도와주는 부분입니다!
  • 로그인 되어 있는 상태에서 우측상단에 로그아웃을 누르면 로그인 페이지로 돌아갑니다!
  • 이전에 '~~님 반갑습니다' 라고 작성했던 {% else %} 와 {% endif %} 사이 부분을 수정 해 줄게요!
  • # user/urls.py from django.urls import path from . import views urlpatterns = [ path('sign-up/', views.sign_up_view, name='sign-up'), path('sign-in/', views.sign_in_view, name='sign-in'), **path('logout/', views.logout, name='logout')** ]
  • views작업을 만들었으니까 url을 이어주도록 할게요!
  • **@login_required**와 user = request.user.is_authenticated 은 모두 로그인 한 사람들만 사용 할 수 있도록 도와주는 기능들입니다.
  • #user/views.py **from django.contrib.auth.decorators import login_required** **@login_required def logout(request): auth.logout(request) # 인증 되어있는 정보를 없애기 return redirect("/")**
  • 우선, view와 url을 만들어줄게요!
  • 완성 된 화면은 아래와 같아요!
  • 로그인이 되어 있다면 로그아웃도 작성 할 수 있어야겠죠~?