저번 포스팅에서는 간단한 로그인 기능까지 구현해 보았는데요. 이번에는 간단한 로그아웃 기능과 템플릿의 상속에 대해 알아보겠습니다.
먼저 간단하게 로그아웃 기능을 구현해보도록 하겠습니다.
user/views.py 로 이동하여 다음과 같이 로그아웃 함수를 추가해주도록 합니다.
1 2 3 4 5 def logout (request) : if request.session.get('user' ): del (request.session['user' ]) return redirect('/' )
작성이 완료되었다면 urls.py 로 이동하여 url을 연결해주도록 합니다.
1 2 3 4 5 6 7 8 from django.urls import path, includefrom . import viewsurlpatterns = [ path('register/' , views.register), path('login/' , views.login), path('logout/' , views.logout), ]
위와 같이 /user/logout 와 같은 경로로 접속시 logout함수를 호출할 수 있도록 작성해 줍니다. 이제 간단하게 확인을 해보도록 하겠습니다. 먼저 user2아이디로 로그인을 수행해보겠습니다.
로그인이 완료되고 개발자도구를 확인해보면 위와 같이 세션id가 발급되어 있는것을 확인할 수 있습니다. 이제 다음과 같이 url을 127.0.0.1:8000/user/logout 라고 입력해줍니다.
입력을 하고 이동해주면 다음과 같이 홈 화면으로 이동이 된 후 세션id가 삭제된 것을 확인할 수 있습니다. 이렇게 간단하게 로그아웃 기능을 구현해보았고 이제 템플릿의 상속에대해 알아보겠습니다.
현재까지 작성된 템플릿 파일인 login.html과 register.html을 보면 거의 유사한 형태로 작성되어 있는 것을 확인할 수 있습니다. 이제 이러한 부분을 조금 더 편리하게 작성하기 위하여 하나의 기준이 되는 템플릿 파일을 작성한 뒤 그 파일을 상속받아 필요한 부분만 추가로 작성할 수 있도록 구현보겠습니다.
우선 templates/user/에 base.html이라는 파일을 하나 생성해줍니다. 이 후 login.html파일의 코드를 복사하여 붙여준 뒤 container내부의 내용만 지워주고 다음과 같이 작성해줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 {% raw %} <html > <head > <meta charset ="utf-8" > <meta name ="viewport" content ="width=device-width, initial-scale=1, shrink-to-fit=no" > <link rel ="stylesheet" href ="/static/bootstrap.min.css" /> <script src ="https://codpye.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 > {% endraw %}
위와 같이 container내부에 다음과 같이 {% block contents %} {% endblock %} 라고 작성해주면 나중에 contents라는 블록에 코드를 추가해 상속받은 base.html 을 사용할 수 있습니다.
이제 login.html 로 이동하여 base.html을 상속받아 다시 작성해보도록 하겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 {% raw %} {% extends "./base.html" %} {% block contents %} <div class ="container" > <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" > <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 > <button type ="submit" class ="btn btn-primary" > 로그인</button > </form > </div > </div > </div > {% endblock %} {%endraw%}
{% extends "base.html" %} 부분이 base.html을 상속받는 부분인데 이렇게 입력하니 인식하지 못하여 {% extends "./base.html" %} 와 같이 현재 디렉토리에 있는 base.html 이라고 지정을 해주니 인식이 잘됩니다.
위와 같이 정상적으로 적용이 된 것을 확인할 수 있습니다.
이제 같은 방법으로 register.html 도 base.html을 상속받아 다시 작성해보겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 {% raw %} {% extends "./base.html" %} {% block contents %} <div class ="container" > <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" > <label for ="username" > 사용자 이름</label > <input type ="text" class ="form-control" id ="username" placeholder ="사용자 이름" name ="username" > </div > <div class ="form-group" > <label for ="username" > 사용자 이메일</label > <input type ="text" class ="form-control" id ="useremail" placeholder ="사용자 이메일" name ="useremail" > </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" > <label for ="re-password" > 비밀번호 확인</label > <input type ="password" class ="form-control" id ="re-password" placeholder ="비밀번호 확인" name ="re-password" > </div > <button type ="submit" class ="btn btn-primary" > 등록</button > </form > </div > </div > </div > </div > {% endblock %} {% endraw %}
register.html도 마찬가지로 위와 같이 정상적으로 적용이 된 것을 확인할 수 있습니다.
여기까지 간단한 로그인 기능과 템플릿의 상속에 대해 알아보았습니다. 다음 포스팅에서는 장고의 form에 대해 알아보도록 하겠습니다.