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')
- 확인
로그아웃 클릭 시 , 바로 로그인 창으로 넘어감
'Web > Django' 카테고리의 다른 글
[Web] ExcelCalculate with django for Mac - 5 (0) | 2023.08.02 |
---|---|
[Web] ExcelCalculate with django for Mac - 3 (0) | 2023.08.01 |
[Web] ExcelCalculate with django for Mac - 2 (0) | 2023.07.31 |
[Web] ExcelCalculate with django for Mac - 1 (0) | 2023.07.31 |
[Web] django로 Todolist 만들기 for Mac - 4 (0) | 2023.07.28 |