Django CBV 프로젝트 3. 사용자 인증 (로그인)

참고 사이트

Views.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 추가
from django.contrib.auth import get_user_model
from django.contrib.auth.views import LoginView
from user.models import User # 모델 import
from user.forms import UserRegistrationForm, LoginForm # form import
from django.contrib import messages #메세지 framework사용

class UserLoginView(LoginView): # 로그인
template_name = 'user/login_form.html'
authentication_form = LoginForm

def form_invalid(self, form):
messages.error(self.request, '로그인에 실패하였습니다.', extra_tags='danger')
return super().form_invalid(form)

urls.py

1
2
3
urlpatterns = [
path('user/login/', UserLoginView.as_view()), # +
]

forms.py

1
2
3
4
5
6
7
8
9
10
11

# 추가
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from django.forms import EmailField

class LoginForm(AuthenticationForm):
username = EmailField(widget=forms.EmailInput(attrs={'autofocus': True}))

# field -> 유효성 검증과 위젯의 기능들을 호출
# widget -> 필드의 실제 렌더링

settings.py

1
2
LOGIN_URL = '/user/login/' # 게시판에 로그인 사용자만 가능하게하기 위해 지정
LOGIN_REDIRECT_URL = '/article/' # 로그인이 되면 /article/로 이동

user/login_form.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


{% extends 'base.html' %}

{% block title %}<title>로그인</title>{% endblock %}

{% block css %}
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<style>
.registration {
width: 360px;
margin: 0 auto;
}
p {
text-align: center;
}
label {
width: 50%;
text-align: left;
}
.control-label {
width: 100%;
}
.registration .form-actions > button {
width: 100%;
}
</style>
{% endblock css %}

{% block content %}
<div class="panel panel-default registration">
<div class="panel-heading">
로그인하기
</div>
<div class="panel-body">
<form action="." method="post">
{% csrf_token %}
{% for field in form %}
<div class="form-group {% if field.errors|length > 0 %}has-error{%endif %}">
<label for="{{ field.id_for_label }}">{{ field.label }}</label>
<input name="{{ field.html_name }}" id="{{ field.id_for_lable }}" class="form-control" type="{{ field.field.widget.input_type }}" value="{{ field.value|default_if_none:'' }}">
{% for error in field.errors %}
<label class="control-label" for="{{ field.id_for_label }}">{{ error }}</label>
{% endfor %}
</div>
{% endfor %}
<div class="form-actions">
<button class="btn btn-primary btn-large" type="submit">로그인하기</button>
</div>
</form>
</div>
</div>
{% endblock content %}

(중요) Session ??

로그인한 사용자에게만 발급하는 일종의 표딱지 사용권

장고의 세션 ->

세션 미들웨어 : 여러가지 세션 백엔드 중 하나를 선택해서 백엔드에게 실제 저장기능을 위임

세션 백엔드 모듈이름 기능
django.contrib.sessions.backends.db 데이터베이스에 저장하는백엔드
django.contrib.sessions.backends.cache 캐시에 저장하는 백엔드
django.contrib.sessions.backends.cache_db 캐시와 데이터베이스를 병행하는 백엔드
django.contrib.sessions.backends.file 파일에 저장하는 백엔드
django.contrib.sessions.backends.signed_cookie 쿠키에 저장하는 백엔드

사용자가 요청을 할 때마다 쿠키의 sessionid 를 확인 후 세션 백엔드 세션데이터를 불러와 request.session 객체에 저장 ,만일 세션데이터가 유효하지 않다면(expire_date, path 등) 빈 세션데이터만 저장

cf) 세션데이터는 사용자가 매 요청마다 불러와야 하는 값이고 응답할 때까지 메모리에 저장하고 있어야 하기 때문에 너무 많은 데이터를 가지고 있으면 서버의 가용성에 지장이 생길 수 있습니다. 대부분의 사용자가 매번 필요한 데이터일 경우에만 세션객체에 추가하셔야 합니다.