Django 로 게시판 만들기(12). 세션 원리 복습과 활용, 로그아웃 구현하기

.·2020년 7월 25일
0

게시판만들기

목록 보기
12/21

1. review session

세션이 동작하기 위해서 '어딘가 에다가' 브라우저마다 저장을 하고 있었다.
브라우저 어디 엔가에 어떤 형태로 세션을 사용하기 위한 정보가 들어가 있다.

바로 "cookie" 라는 곳에 저장이 된다.

복잡한 문자열로 된 key 가 클라이언트를 식별하는 식별자가 된다.

그럼 이 cookie 에 들어 있는 session id 를 가지고 서버에서 클라이언트를 식별하며 그 데이터를 가지고 있는데, 입력한 비밀번호가 모델(DB) 에 저장된 비밀번호와 같다면?

그 때 사용하는 변수가 어떤 변수가 있었지?

# def login(request):
if check_password(password, member.password):
    request.session['user'] = member.id
    # 고유한 id 값을 session 에 저장 한 것이다.
    return redirect('/')

유저가 로그인을 했는지 여부를 판단하기 위해서 "세션으로부터 값을 가지고 와서" 확인을 해본다.

# def home(request):
    user_id = request.session.get('user')
    if user_id:
        member = BoardMember.objects.get(pk=user_id)
        return HttpResponse(member.username)
    return HttpResponse('Home!')

user_id 값이 있으면 로그인을 한 클라이언트이고 없으면 로그인을 하지 않은 클라이언트이다.

시크릿 창을 열어 root 페이지를 보면 Home! 이라 되어 있고 cookie 에는 아무 것도 확인할 수 없다. 왜냐면 세션 키를 받아오지 못했기 때문이다.

로그인을 했을 때,

  • 세션 id 가 생성이 되고
  • 그 'user' 에다가 정보를 넣었기 때무에 로그인한 client 가 된 것이다.,

그래서 home 으로 리다이렉트 해 사용자 정보를 보여준 것이다.

2. 로그아웃 기능 만들기

로그인을 판단하는 기준은?

세션 안에 'user' 키로 값이 들어 있는지 없는지의 유무로 판단했다.

그럼 로그아웃은?

세션 안에 있는 'user' 키를 지운 뒤 root 로 리다이렉트 하는 코드를 쓰면 된다.

def logout(request):
    if request.session.get('user'):
        del(request.session['user'])

    return redirect('/')

그리고 member 앱의 urls.py 로 가서 수정한다.

from django.urls import path
from . import views

urlpatterns = [
    path('register/', views.register),
    path('login/', views.login),
    path('logout/', views.logout),
]

3. 전체 member/views.py 코드

from django.shortcuts import render, redirect
from django.http import HttpResponse
from django.contrib.auth.hashers import make_password, check_password

from .models import BoardMember

def home(request):
    user_id = request.session.get('user')
    #print(user_id)
    if user_id:
        member = BoardMember.objects.get(pk=user_id)
        return HttpResponse(member.username)

    return HttpResponse('Home!')

def login(request):
    if request.method == "GET":
        return render(request, 'login.html')

    elif request.method == "POST":
        username = request.POST.get('username', None)
        password = request.POST.get('password', None)

        res_data ={}
        if not (username and password):
            res_data['error'] = '모든 값을 입력하세요!'

        else:
            member = BoardMember.objects.get(username=username)
            #print(member.id)

            if check_password(password, member.password):
                #print(request.session.get('user'))
                request.session['user'] = member.id

                return redirect('/')


            else:
                res_data['error'] = '비밀번호가 다릅니다!'

        return render(request, 'login.html', res_data)

def logout(request):
    if request.session.get('user'):
        del(request.session['user'])

    return redirect('/')

def register(request):
    if request.method == "GET":
        return render(request, 'register.html')

    elif request.method == "POST":
        #print (request.POST)
        username    = request.POST.get('username', None)
        #print(username)
        password    = request.POST.get('password', None)
        #print(password)
        re_password = request.POST.get('re_password', None)
        #print(re_password)
        email       = request.POST.get('email', None)


        res_data = {}
        if not (username and password and re_password and email):
            res_data['error'] = '모든 값을 입력하세요!'

        elif password != re_password:
            res_data['error'] = '비밀번호가 다릅니다'
            print(res_data)

        else:
            member = BoardMember(
                username    = username,
                email       = email,
                password    = make_password(password)
            )
            member.save()

        return render(request, 'register.html', res_data)
profile
.

0개의 댓글