#18 로그인/로그아웃

#18 로그인/로그아웃

1. common 앱

로그인/로그아웃과 같이 다른 여러 앱들에도 공통적으로 적용되어야하는 기능들은 하나의 앱에 종속되지 않도록

분리하는 것이 좋다. 여기서는 이러한 공통 기능들은 common 이라는 앱을 생성하여 그 안에 구현하기로 한다.

pybo 앱을 처음 만들었을 때 처럼 터미널에서 django-admin startapp 명령어를 실행하여 common 앱을 만든다.

그 다음 config/settings.py 에서 pybo 앱을 만들었을 때 처럼 앱을 등록해준다.

pybo의 url 매핑을 등록했을 때 처럼 common 앱의 url 매핑 파일도 config/urls.py 에 등록해준다.

마지막으로 common 앱에 실제로 urls.py 를 생성하여 위와같이 작성해주면 common 앱의 설정이 완료되었다.

아직 common 내부에 구현한 기능이 없기에 url 패턴 리스트는 비어있는 상태이다.

2. 로그인 화면

본격적인 로그인 기능을 구현하기 위해서는 먼저 로그인 화면이 필요하다.

네비게이션 바를 추가했을 때 만들었던 로그인 링크를 위와 같이 수정한다.

그리고 common 앱의 urls.py 에 위와 같이 실제로 login 에 해당하는 매핑을 추가해준다. 로그인 뷰는 별도로 만들

필요 없이 django.contrib.auth 의 LoginView 를 사용한다.

3. 로그인 템플릿 구현

지금 상태에서 로그인 페이지에 접속하려하면 login.html 템플릿이존재하지 않는다는 오류가 발생한다. 로그인 화면을

띄우기 위해 호출되는 LoginView는 registration 이라는 디렉토리에서 login.html 파일을 찾기 때문에 이 login.html

파일을 구현해줄 필요가 있다. 다만 여기서는 로그인 기능을 common 앱 내에 구현할 것이기 때문에 login.html

파일을 registration 이 아닌 templates/common 디렉토리에 만들 것이다.

먼저 common 앱의 urls.py 를 위와 같이 수정하여 LoginView 가 registration 이 아닌 common앱의 템플릿 디렉토리를

참조하도록 한다.

그리고 templates 디렉토리에 common 디렉토리를 생성하고 그 안에 login.html을 위와 같이 작성한다.

마지막으로 login.html에서 include 된 form_errors.html 을 templates 디렉토리의 하위에 위와 같이 작성해준다.

4. 로그인 실행

여기까지 완료했으면 로그인 기능 자체는 구현이 완료되었다. pybo 에 접속하여 실제로 로그인을 실행해보자.

먼저 로그인 링크를 클릭하면 이제 로그인 화면을 볼 수 있다. 아직까지 로그인 가능한 계정은 슈퍼유저로 등록했던

계정 뿐이다. 슈퍼유저로 로그인을 시도해보자.

base_url/accounts/profile/ 페이지를 찾을 수 없다는 404 에러가 발생한다. 이는 django.contrib.auth 패키지를 사용하여

로그인 기능 구현 시, 로그인이 성공하면 디폴트로 위 url로 이동하기 때문에 발생하는 문제이다.

config/settings.py 의 마지막 줄에 LOGIN_REDIRECTED_URL 로 '/' 를 지정해주면 로그인 이후 자동으로 base_url/ 로

이동하게 된다.

마지막으로 config/urls.py 를 위와 같이 수정하여 base_url/ 요청시 pybo/views.py의 index 함수가 호출되도록 매핑을

추가한다.

이제 로그인 후 정상적으로 게시판 화면으로 이동하는 것을 확인할 수 있다. 그러나 로그인을 했는데도 로그인 링크가

여전히 존재하는 것을 확인할 수 있다. 다음은 로그아웃을 구현하여 이를 해결할 차례이다.

5. 로그아웃

먼저 내비게이션 바의 템플릿 코드를 로그인한 경우 로그인 버튼 대신 로그아웃 버튼이 나타나도록 수정해야한다.

위와 같이 user.is_authenticated 를 사용하여 로그인 상태인지를 판별, 로그인 되어있다면 로그인 대신 로그아웃 링크를

표시하도록 내비게이션 바의 템플릿을 수정한다.

물론 common 앱의 urls.py 에도 logout 에 해당하는 url 매핑을 정의해준다. 로그아웃 기능에 별도의 화면이 필요하진

않기 때문에 로그인 구현과 같이 템플릿 경로 수정등의 작업은 필요하지 않다.

마지막으로 config/settings.py 에 로그아웃 리다이렉트 url도 추가해주면 로그아웃의 구현도 끝이다.

6. 테스트

로그인 전

로그인 전의 페이지이다. 로그인 링크가 표시되고있음을 확인 가능하다.

로그인 화면

로그인 화면이다. 슈퍼계정을 사용하여 로그인을 시도해본다.

로그인 후

로그인이 성공하자 첫 페이지로 리다이렉트되며 로그인 링크 대신 로그아웃 링크가 표시되는 것을 확인할 수 있다.

로그아웃 후

로그아웃 링크를 클릭하면 다시 첫 페이지로 리다이렉트되며 다시 로그인 링크가 표시되는 것을 볼 수 있다.

이제 pybo 에는 로그인/로그아웃 기능이 성공적으로 구현되었다.

from http://scala0114.tistory.com/101 by ccl(A) rewrite - 2021-09-30 22:00:39