티스토리 뷰

● 로그인

 

users/forms.py

- 필드를 설정하고 clean을 통해 유효성을 검사한다는 점에서 RegisterForm과 유사한 방식을 갖는다. 하지만, 로그인 폼에서는 존재하는 이메일인지 확인하는 try 와 존재하지 않는 경우의 예외 처리(Users.DoesNotExist) 코드, check_password 를 사용하여 비밀번호를 확인한다.

class LoginForm(forms.Form):
    email = forms.EmailField(
        error_messages={'required':'이메일을 입력하세요'},
        max_length=64, label = "이메일"
    )
    password = forms.CharField(
        error_messages = {'required' : "비밀번호를 입력하세요"},
        max_length = 128, label = "비밀번호", widget = forms.PasswordInput
    )
    
    def clean(self):
        cleaned_data = super().clean()
        email = cleaned_data.get('email')
        password = cleaned_data.get('password')
        
        if email and password :
            try:
                user = Users.objects.get(email = email)
            except Users.DoesNotExist:
                self.add_error('email', "존재하지 않는 이메일입니다.")
                return
            
            if not check_password(password, user.password):
                self.add_error('password', '비밀번호가 일치하지 않습니다.')

 

 

users/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">
        <form method = "POST" action = ".">
            {% csrf_token %}
            {% for field in form %}
            <div class = "form-group">
                <label for = "{{ field.id_for_label }}">{{field.label}}</label>
                <input type = "{{field.field.widget.input_type}}" class = "form-control" id = "{{field.id_for_label}}"
                placeholder="{{field.label}}" name = "{{field.name}}">
            </div>
            {% if field.errors %}
            <span style = "color:red">{{field.errors}}</span>
            {% endif %}
            {% endfor %}
            
            <button type = "submit" class = "btn btn-primary">로그인</button>
        </form>
    </div>
</div>

{% endblock %}

 

 

users/views.py

- LoginForm이 제대로 입력되었다면 세션에 이메일 정보를 저장한다. 

class LoginView(FormView):
    template_name = 'login.html'
    form_class = LoginForm
    success_url = '/'

    def form_valid(self, form):
        self.request.session['user'] = form.data.get('email')
        return super().form_valid(form)

 

 

로그인 실행 결과 

- 제대로 로그인 되어 home 화면으로 이동하고 로그인되어있는 아이디를 출력하는 것까지 볼 수 있다.

 

 

 

 

 

● 로그아웃

 

users/views.py

- 로그아웃은 html도 form도 아무것도 필요없이 세션 정보만 삭제해주면 된다. 로그아웃하고나서 홈화면으로 이동하게 한다. 

def logout(request):
    if request.session.get('user'):
        del(request.session['user'])
    return redirect('/')
댓글