로그 아웃을 하려면 로그아웃 후에 이동 할 화면과 로그인 후 이동 할 화면이 나뉘어야해요! 로그인 후 화면을 만들어 보고, 필요한 기능들을 만들어 보도록 하겠습니다!
- 로그인 필수 기능 적용하기로그인과 관련된 기능은 대표적으로 두 가지가 있습니다!
- 로그인 한 사람만 페이지에 접근 가능하게 만들기
- 로그인 한 사람은 사용 안 해도 되는 페이지
- 2번은 tweet앱의 views.py 파일 안에 구현 된 home 함수를 참고해서 작업을 해 보려고 해요!
- '로그인 필수' 라는 얘기 어디서 많이 들어보셨죠~?? 페이지에 접근 할 수 있는 사람을 '로그인 한 사람' 으로만 제한 하려고 해요!
-
- 로그인 한 사람만 페이지에 접근 가능하게 만들기
request.user.is_authenticated 라는 기능은 아까 봤었던 기능이죠~? 지금 요청을 보낸 사용자가 로그인이 되어 있는 사용자가 맞는지 알아보는 함수입니다.# 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')**
- 그 외의 사용자들은 http://127.0.0.1:8000/sign-in 으로 되돌아가게 됩니다.
- tweet앱의 views.py를 열어 주시고, 아래의 코드처럼 tweet 함수에 로그인 한 사용자를 판단하는 기능을 추가 해 주세요!
-
- 로그인 한 사람은 사용 안 해도 되는 페이지 기능 만들기
sign_up_view의 GET 요청 부분에, user = request.user.is_authenticated 코드를 추가해서 사용자가 로그인 된 상태인지 한번 더 확인했습니다.# 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') # 회원가입이 완료되었으므로 로그인 페이지로 이동
마찬가지로 **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')**
- windows : Ctrl + Shift + n
- macOS : ⌘ + Shift + n
- 로그인 후, 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>
- 로그아웃 구현하기로그인 후에 상단에 나오는 '~~님 반갑습니다!' 주변에 로그아웃 기능을 넣어주려고 합니다!
- 위와 같이 "~~ 님 반갑습니다 " 옆에 로그아웃 버튼이 생깁니다.
- 로그아웃을 누르면 로그인 페이지로 갑니다.
- from django.contrib.auth.decorators import login_required 는 views.py 의 가장 상단에 추가 해주세요.
- logout함수 위에 @login_required 를 추가 해 주세요!
여기에서 모두 기억 하지 않아도 됩니다!! <a class="nav-link" href="/logout"> 로그아웃 </a> 부분이 우리의 로그아웃을 도와주는 부분입니다!<!-- 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> ****... 생략
- 로그인 되어 있는 상태에서 우측상단에 로그아웃을 누르면 로그인 페이지로 돌아갑니다!
- 이전에 '~~님 반갑습니다' 라고 작성했던 {% 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을 만들어줄게요!
- 완성 된 화면은 아래와 같아요!
- 로그인이 되어 있다면 로그아웃도 작성 할 수 있어야겠죠~?
'Django' 카테고리의 다른 글
[Django] 장고 게시글 읽기/삭제 기능 만들기 ##### (0) | 2023.05.25 |
---|---|
[Django] 게시글 쓰기 기능 만들기 ##### (0) | 2023.05.25 |
[Django] 로그인 후 장고 템플릿, 네비게이션 바 수정 ##### (0) | 2023.05.25 |
[Django] 로그인 후 페이지 이동하기 ##### (1) | 2023.05.25 |
[django] 사용자 모델 비교 / 업그레이드 (0) | 2023.05.25 |