if user_id and password: try: user = User.objects.get(user_id=user_id) except User.DoesNotExist: self.add_error('user_id', '아이디가 존재하지 않습니다.') return if not check_password(password, user.password): self.add_error('password', '비밀번호가 틀렸습니다.')
LoginForm 클래스를 생성한 뒤 입력필드에 맞는 적절한 widget을 삽입합니다.
clean 함수를 클래스 내부에 추가하고 해당 입력값에 맞는 표준 형식으로 변환하기 위해 cleaned_data로 form에 입력된 user_id와 password 값을 담아두고 검사하여 아이디 존재여부와 비밀번호 오류를 form에서 처리하도록 구현하였습니다.
def form_valid(self, form): user_id = form.cleaned_data.get("user_id") password = form.cleaned_data.get("password") user = authenticate(self.request, username=user_id, password=password) if user is not None: self.request.session['user_id'] = user_id login(self.request, user)
return super().form_valid(form)
마찬가지로 이미 로그인 중인 사용자의 접근을 막기 위해 logout_message_required를 사용하고, 직접 구현한 decorators의 user객체를 비교하기 위해 user_id란 이름의 세션에 로그인한 user_id 값을 추가합니다. form_valid를 통과한 user 객체가 존재한다면 로그인을 한 후 작성되어 있는 main페이지로 이동하게됩니다.
3. 로그아웃 views.py 작성
Django의 logout을 호출하면 현재 요청에 대한 세션이 모두 제거됩니다. views.py에 logout을 import 한 후 아래의 코드를 입력합니다.
위 소스는 login.html의 user_id 입력 필드입니다. { { form.user_id } }로 forms.py에서 설정한 widget type을 생성하고 add_error가 있다면 erros 값으로 넘어와 오류를 출력하게 됩니다. password 입력 필드 또한 ‘user_id’ 부분을 forms.py에서 지정한 ‘password’로 바꿔 작성하면 로그인 템플릿 구현이 완료됩니다.
6. 결과
*전체 html, css 등은 자세하게 포스팅하지 않습니다. 제 Github에서 소스를 확인하실 수 있습니다.