본문 바로가기
Web/Django

[Web]ExcelCalculator with django for Mac - 4

by skwkiix 2023. 8. 2.
728x90
이 포스팅은 "Django 한그릇뚝딱"의 Chapter4 내용을 실습하며 정리한 내용이다.

 

로그인, 로그아웃

세션을 이용하여 사용자의 로그인 정보를 관리(로그인된 사용자인지 판단 필요)

1. 사용자 정보를 세션으로 저장

1) 추가 설정

  • ExcelCalculate > settings.py 확인
MIDDLEWARE = [
   "django.middleware.security.SecurityMiddleware",
   "django.contrib.sessions.middleware.SessionMiddleware", # 확인
   "django.middleware.common.CommonMiddleware",
   "django.middleware.csrf.CsrfViewMiddleware",
   "django.contrib.auth.middleware.AuthenticationMiddleware",
   "django.contrib.messages.middleware.MessageMiddleware",
   "django.middleware.clickjacking.XFrameOptionsMiddleware",
]
​
INSTALLED_APPS = [
   "django.contrib.admin",
   "django.contrib.auth",
   "django.contrib.contenttypes",
   "django.contrib.sessions", # 확인
   "django.contrib.messages",
   "django.contrib.staticfiles",
   "main", 
   "sendEmail", 
   "calculate"
]

2) views.py 수정

쿠키를 통해 사용자 정보 저장하는 코드 주석처리,

사용자 정보를 세션에 저장

  • main > views.py
def verify(request):
   # 사용자가 입력한 code값을 받아야 함
   user_code = request.POST['verifyCode']
​
   # 쿠키에 저장되어 있는 code값을 가져온다. (join 함수 확인)
   cookie_code = request.COOKIES.get('code')
   print("코드 확인: ", user_code, cookie_code)
​
   if user_code == cookie_code:
       user = User.objects.get(id=request.COOKIES.get('user_id')) # SELECT FROM WHERE id = cookie_id 데이터를 가져오는 것, 
       user.user_validate = 1 # True 1 False 0
       user.save()
​
       print("DB에 user_validate 업데이트-----------------")
​
       response = redirect('main_index')
​
       # 저장되어 있는 쿠키를 삭제
       response.delete_cookie('code')
       response.delete_cookie('user_id')
       # response.set_cookie('user', user) # 주석처리
​
       # 사용자 정보를 세션에 저장
       request.session['user_name'] = user.user_name   ## 로그인 화면 구현 
       request.session['user_email'] = user.user_email ## 로그인 화면 구현
​
       return response
​
   else:
       return redirect('main_verifyCode') # verifyCode 화면으로 돌리기 
​

2. 로그인 기능 구현

로그인 버튼 클릭시, 이동할 url 처리

로그인 처리 함수

  • main > signin.html

<action = "signin/login" .. >

<div class="content">
           <div class="mainDiv">
               <h3>안녕하세요. 로그인을 진행해주세요.</h3><br>
               <form action="signin/login" method="POST">{% csrf_token %}
                   <div class="input-group">
                       <span class="input-group-addon" id="basic-addon1">이메일</span>
                       <input type="email" name='loginEmail' class="form-control" placeholder="이메일을 적어주세요." aria-describedby="basic-addon1">
                   </div><br>
                   <div class="input-group">
                       <span class="input-group-addon" id="basic-addon1">비밀번호</span>
                       <input type="password" name='loginPW' class="form-control" placeholder="비밀번호를 적어주세요." aria-describedby="basic-addon1">
                   </div><br>
                   <input type="submit" class="btn btn-success btn-lg" value="로그인">
               </form>
               <a href="signup">회원가입하기</a>
           </div>
       </div>

 

  • main > urls.py 설정

로그인 버튼 클릭 시, 이동할 url 처리 > login 함수로 url 처리를 넘겨줌

from django.urls import path 
from . import views 
​
urlpatterns = [
   path('', views.index, name="main_index"), 
   path('signup', views.signup, name="main_signup"), 
   path('signup/join', views.join, name="main_join"),
   path('signin', views.signin, name="main_signin"),
   path('signin/login', views.login, name="main_login"), #추가
   path('verifyCode', views.verifyCode, name="main_verifyCode"),
   path('verify', views.verify, name="main_verify"), 
   path('result', views.result, name="main_result"), 
]

 

  • main > views.py 설정

사용자가 입력한 이메일, 비밀번호 불러와서 입력 값과 user 데이터에 저장된 값이 일치하는 지 확인

일치 > 메인화면으로 이동

불일치 > 다시 로그인 화면으로 이동

def login(request): 
   # 로그인된 사용자만 이용할 수 있도록 구현
   # 이 때, 현재 사용자가 로그인된 사용자인지 판단하기 위해 세션 사용 FROM (verify함수에서 만든 세션)
   # 세션 처리 진행
   print("----------------------------------접근--------")
   loginEmail = request.POST['loginEmail']
   loginPW = request.POST['loginPW']
   user = User.objects.get(user_email=loginEmail)
   if user.user_password == loginPW:
       print("매칭 성공")
       request.session['user_name'] = user.user_name # 사용자가 회원가입 시, 입력한 정보
       request.session['user_email'] = user.user_email # 사용자가 회원가입 시, 입력한 정보
       return redirect('main_index')
   else:
       # 로그인 실패, 정보가 다름
       print("매칭 실패")
       return redirect("main_loginFail")

3. 메인화면 로그인

로그인 사용자만 접속 가능하게 설정

  • main > views.py

Index , result 함수 로그인 처리 구현

def index(request):
   # 로그인된 사용자만 접근
   # 조건문 : 사용자의 정보가 세션에 존재하면 메인(=서비스) 화면으로 출력
   #         만약, 사용자의 정보가 세션에 없다면 로그인 화면으로 출력 
   if 'user_name' in request.session.keys():
       return render(request, 'main/index.html') # 사용자의 세션 정보가 담겨져 있는 상태에서의 index.html
   else:
       return redirect('main_signin')
   
   # return render(request, "main/index.html") # 아무런 세션 정보가 없는 index.html 
​
​
def result(request):
   if 'user_name' in request.session.keys(): #장고에서 세션값은 딕셔너리 형태로 저장
       return render(request, 'main/result.html') # 사용자의 세션 정보가 담겨져 있는 상태에서의 index.html
   else:
       return redirect('main_signin')
​

4. 로그아웃 기능 구현

  • main > urls.py

로그아웃 버튼 클릭 시, ~/logout 으로 이동

urlpatterns = [
   path('', views.index, name="main_index"), 
   path('signup', views.signup, name="main_signup"), 
   path('signup/join', views.join, name="main_join"),
   path('signin', views.signin, name="main_signin"),
   path('signin/login', views.login, name="main_login"), 
   path('verifyCode', views.verifyCode, name="main_verifyCode"),
   path('verify', views.verify, name="main_verify"), 
   path('result', views.result, name="main_result"), 
   path('logout', views.logout, name="main_logout") # 추가
]

 

  • main > views.py

logout 함수로 처리, 로그 아웃시 세션에서 user_name, user_email 정보 삭제

ef logout(request):
   # 로그아웃의 개념 : 세션 정보를 삭제하는 것
   # 파이썬에서 객체를 지울 때 
   del request.session['user_name']
   del request.session['user_email']
​
   return redirect('main_signin')

 

  • 확인

로그아웃 클릭 시 , 바로 로그인 창으로 넘어감

메인
로그아웃 버튼 클릭 시