rueki

Django 기초07. 세션관리 본문

Django

Django 기초07. 세션관리

륵기 2019. 11. 22. 22:11
728x90
반응형

이번 시간에는 세션 관리에 대해서 알아보자.

로그인을 하고 로그인 한 user의 id를 세션에 넣어보자

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:
            user = User.objects.get(username=username)
            if check_password(password, user.password):
                #--------------------------------------------------------------------
                request.session['user'] = user.id # user key에 로그인한 user의 아이디 값
                #변수에 값넣음
                return redirect('/')#로그인 후 들어갈 사이트
                #비밀번호 일치, 로그인 처리
                #세션
                #---------------------------------------------------------------------
            else:
                res_data['error'] = '비밀번호를 틀렸습니다!'

        return render(request,'login.html',res_data) #페이지에 표시하기 위함

이전 시간에 작성한 로그인 함수에 저 부분을 추가해주자.

딕셔너리 구조의 세션에 user의 KEY 값에 user.id를 넣어준다.

로그인을 했을 때 메인화면으로 오는 것이 홈페이지의 기본 구조이니 메인 페이지 이동을 해보자.

프로젝트의 url을 관리해야함에 따라서, 프로젝트 폴더 하단의 ursl.py에 코드를 추가하자.

urlpatterns = [
    path('admin/', admin.site.urls),
    path('user/', include('user.urls')),
    path('', home)
]

path를 구성했지만,home 함수를 구현하지 않아서 새로 만들어주어야한다.

그리고 home은 views.py에 작성할 것이기 때문에 from user.views import home을 해주어야 할 것이다.

자, 이제  home 함수를 구현해보자

def home(request):
    user_id = request.session.get('user') #세션으로부터 유저 정보 가져오기
    if user_id:
        user = User.objects.get(pk=user_id)
        return HttpResponse(user.username)
    return HttpResponse("HOME!")

로그인도 간략하게 구현해보았으니 이제 로그아웃도 만들어보자

첫째로, user의 urls.py에 아래 코드를 추가해주고, views.py에 로그아웃 함수를 만들어보자

path('logout/',views.logout)

로그아웃은 간단하다. user를 세션에 리퀘스트 받아서 넣고 그것이 존재할 때, 삭제하면 되는 것이다.

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

    return redirect('/')

이제 페이지의 기본인 로그인 / 로그아웃은 만들어보았다.

이제 코드의 가독성을 높이기 위해서 상속 개념을 사용해보자.

base.html을 만들자 우선.

<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

        <!--<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">-->
        <link rel="stylesheet" href="/static/bootstrap.min.css">
        <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
    </head>
    <body>
        <div class ="container">
           {% block contents %} #추가
           {% endblock %} #추가
            
        </div>
        

    </body>
</html>

block contents와 endblock 사이에 이제 작성할 부분을 넣어서 각 html 내용을 간략하게 보이게 할 것이다.

login.html을 위에 코드를 적용해보자.

{% extends "base.html" %}

{% block contents %}
<div class="row mt-5">
<div class="col-12 text-center">
    <h1>로그인</h1>

</div>
</div>
<div class="row mt-5">
    <div class="col-12">
        {{error}}
    </div>
</div>
<div class="row mt-5">
    <div class="col-12">
        <form method="POST" action=".">
            {% csrf_token %}
            <!--크로스 도메인 막기위해 암호화된 키 숨겨놓는다.-->
            <div class="form-group">
                <!--form의 경우 데이터를 서버에 전달-->
                <label for="username">사용자 이름</label>
                <input type="text" class="form-control" id="username" placeholder="사용자 이름" name="username">
            </div>

            <div class="form-group">
                <label for="password">비밀번호</label>
                <input type="password" class="form-control" id="password" placeholder="비밀번호" name="password">
            </div>
            <div class="form-group">

                <button type="submit" class="btn btn-primary">로그인</button>
        </form>

    </div>
</div>
</div>
{% endblock %}

코드가 훨씬 간결해진 것을 볼 수가 있다. 상속 개념을 사용해서 가독성이 좋아졌다.

다음시간에는 로그인 Form을 활용하는 시간을 가져보자

728x90
반응형
Comments