본문 바로가기

인문학도 개발일지/웹프로그래밍

[수업노트] django - 회원가입, 로그인, 로그아웃 기능 구현

 

로그인 기능은 왜 필요한가?

 

동적인 기능을 하는 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'),
]