로그인 기능은 왜 필요한가?
동적인 기능을 하는 login view
로그인: 프로그램 실행 요청 개념
세션관리
세션: 로그인에서 로그아웃까지, 프로그램을 시작해서 이용을 종료할 때 까지
forms.py
# 로그인 폼
class LoginForm(forms.Form):
email = forms.EmailField(
label='이메일',
widget=forms.EmailInput(attrs={'class':'form-control'})
)
password = forms.CharField(
label='비밀번호',
widget=forms.PasswordInput(attrs={'class':'form-control'})
)
def clean(self):
cleaned_data = super().clean() # 부모에 있는 값을 clean으로 받아오기
email = cleaned_data.get('email')
password = cleaned_data.get('password')
try:
member = Member.objects.get(pk=email)
if not check_password(password, member.password):
self.add_error('password', '비밀번호가 틀렸습니다.')
except:
# 없는 이메일(id)
self.add_error('email', '가입하지 않은 이메일 주소입니다.')
views.py
# 로그인 처리 View
class LoginView(FormView):
template_name = 'account/login_form.html'
form_class = LoginForm
success_url = '/' # 메인으로
def form_valid(self, form):
cleaned_data = form.cleaned_data
email = cleaned_data.get('email') # db에 저장되어 있는 email
# Session객체-dictionary 형태:key-value쌍이 필요
# 로그인 -> session에 로그인 여부를 확인할 수 있는 체크값을 넣어둔다.
self.request.session['user'] = email # request: HttpRequest(사용자 HTTP 요청정보)
return super().form_valid(form)
home.html
{%extends 'base.html'%}
{%block title%}Home{%endblock%}
{%block contents%}
<div class='row'>
<h1 class='col-sm-12 m=3'>My Community</h1>
{# 템플릿에서 세션 접근: request.session.key #}
{% if request.session.user %}
{{request.session.user}}님 안녕하세요.
{% endif %}
</div>
{%endblock contents%}
base.html
<body>
<nav class="navbar navbar-expand-sm bg-dark navbar-dark">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" href="/">Home</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/admin">관리자메뉴</a>
</li>
{% if not request.session.user %}
<li class="nav-item">
<a class="nav-link" href="{% url 'account:join' %}">회원가입</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'account:login' %}">로그인</a>
</li>
{% else %}
<li class="nav-item">
<a class="nav-link" href="{% url 'account:logout' %}">로그아웃</a>
</li>
{% endif %}
</ul>
</nav>
<div class='container mt-5'>
{% block contents%}
{% endblock contents%}
</div>
</body>
views.py
# 로그아웃
def logout(request):
request.session.clear() # 세션에 저장된 세션데이터를 모두 제거.
return render(request, 'home.html')
urls.py
from django.urls import path
from account import views
app_name = 'account'
urlpatterns = [
path('join', views.JoinView.as_view(), name='join'),
path('login', views.LoginView.as_view(), name='login'),
path('logout', views.logout, name='logout'),
]
'인문학도 개발일지 > 웹프로그래밍' 카테고리의 다른 글
[파이썬][pandas] 기업 주식 데이터 불러오기 - DataReader (0) | 2020.04.11 |
---|---|
[수업노트] django - 회원정보 조회 (0) | 2020.03.01 |
[수업노트] django - 회원가입, 로그인 화면 구현 (0) | 2020.02.27 |
[수업노트] django 페이지네이션 - paginator (0) | 2020.02.20 |
[수업노트] Bootstrap - 부트스트랩 개요 (0) | 2020.02.15 |