rueki
Django 기초07. 세션관리 본문
이번 시간에는 세션 관리에 대해서 알아보자.
로그인을 하고 로그인 한 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을 활용하는 시간을 가져보자
'Django' 카테고리의 다른 글
Django 기초06. static 관리 (0) | 2019.11.21 |
---|---|
Django 기초 05. 이메일 필드 추가 (0) | 2019.11.20 |
Django 기초 04. 회원가입 (0) | 2019.11.20 |
Django 기초 3. admin 활용 (0) | 2019.11.20 |
Django 기초 2. 프로젝트 및 앱 생성, 데이터베이스 관리 (0) | 2019.11.20 |