본문 바로가기

Django/따라하는 장고

18. 로그인 기능

로그인 기능을 만들어보자. 로그인, 로그아웃을 도와주는 앱은 django.contrib.auth 이다. 이 앱은 장고 프로젝트 생성시 자동으로 추가된다. projects\mysite\config\settings.py 를 확인해보자.

 

로그인, 로그아웃기능을 구현해야한다. 로그인, 로그아웃기능은 pybo앱에 구현할수도 있지만, 하나의 웹 사이트에는 파이보와 같은 게시판 서비스 이외에도 블로그나 쇼핑몰같은 굵직한 단위의 앱들이 함께 있을 수 있기 때문에 공통으로 사용되는 기능인 로그인기능은 하나의 앱에 종속시키는게 좋다. 그렇기 때문에 common 앱에 구현하는게 좋다.

 

일단 common 앱을 다음 명령어를 입력해 새로 생성하자.

그렇게 하면 

자동으로 디렉토리와 파일들이 자동으로 생성된다.

그리고 config\settings.py 파일에 방금 생성된 common 앱을 등록하면된다.

projects\mysite\config\settings.py 에 다음과 같이 추가하자.

common 앱의 urls.py 파일을 사용하기 위해 projects\mysite\config\urls.py 파일을 다음과 같이 수정하자.

이렇게 하면 http://localhost:8000/common/ 으로 시작하는 URL 은 모두 common/urls.py 파일을 참조한다. 참조하기 위해 파일을 새로 만들자.

파일은 원하는 방법으로 알아서 만들자.

아직 common 앱에 어떤 기능도 구현하지 않았으므로 urlpatterns 는 빈상태로 놔두면 된다.

 

[로그인]

 

먼저 로그인 화면으로 진입할 수 있도록 projects\mysite\templates\navbar.html 파일의 로그인 링크를 다음처럼 수정하자.

navbar.html 파일에서 템플릿 태그로 {% url 'common:login' %} 를 작성했으므로 common/urls.py 파일에 URL 매핑규칙을 추가해야한다.

projects\mysite\common\urls.py 를 다음과 같이 수정하자.

로그인 뷰는 따로 만들 필요없이 위 코드처럼 django.contrib.auth 앱의 LoginView 를 사용하도록 설정했다.

 

여기까지 하고 파이보 페이지에서 로그인 버튼을 눌러보면 오류 페이지가 나타난다.

이 오류는 registration 디렉토리에 login.html 파일이 없다는 것을 의미한다. 앞에서 사용한 LoginView는 registration 이라는 템플릿 디렉토리에서 login.html 파일을 찾는다. 이 파일을 찾지 못해 오류가 발생한것이다. 해결하려면 registration/login.html 템플릿파일을 작성해야한다.

그런데 우리는 로그인을 common 앱에 구현할 것이므로 오류메세지에 표시한 것처럼 registraion 디렉토리에 템플릿 파일을 생성하기보다는 common 디렉토리에 템플릿을 생성하는게 좋다. 이를위해 LoginView 가 common 디렉토리의 템플릿을 참조할 수 있도록 projects\mysite\common\urls.py 파일을 다음과 같이 수정하자.

이렇게 수정하면 registrration 디렉토리가 아니라 common 디렉토리에서 login.html 파일을 참조하게 된다. 그 후 다시 로그인 버튼을 누르면

오류 내용이 수정된것을 볼 수 있다. 오류 내용을 보면 알 수 있듯이 이젠 common/login.html 이 없다는 오류다.

그렇다면 common/login.html 파일을 생성하기 위해 common 템플릿 디렉토리를 다음과 같이 생성하자. 그 후 login.html 파일을 만들자. projects\mysite\templates\common\login.html 에 다음과 같이 작성하자.

사용자ID 와 비밀번호를 입력으로 받아 로그인하는 간단한 템플릿이다. 로그인에 사용되는 사용자 ID를 의미하는 username 과 비밀번호를 의미하는 passwrod 항목이 있다. 이 2가지는 django.contrib.auth 인증시 username 과 password 이 2개의 항목은 반드시 필요하다.

그리고 {% csrf_token %} 바로 밑에 Include 태그로 포함된 form_errors.html 템플릿  파일은 다음과 같이 작성해주자.

projects\mysite\templates\form_errors.html 파일을 새로 만들고 작성하자.

form_errors.html 템플릿은 로그인 실패시 로그인이 왜 실패했는지 알려주는 역할을 한다. 폼 오류에는 다음과 같이 두 가지 종류의 오류가 있다. 필드 오류(field.errors) 와 넌필드오류(form.non_field_errors) 이다.

필드 오류는 사용자가 입력한 필드 값에 대한 오류로 값이 누락되었거나 필드의 형식이 일치하지 않는 경우에 발생하는 오류이다. 넌필드 오류는 필드의 값과는 상관없이 다른 이유로 발생하는 오류이다. form_errors.html 템플릿은 필드 오류와 넌필드 오류 모두를 표시하기 위해 삽입되는 템플릿이다. question_form.html, question_detail.html 템플릿에서 오류를 표시하기위해 추가했었던 HTML 코드를 {% include "form_errors.html" %} 로 대체해도 좋다.

 

이제 로그인 버튼을 눌러 로그인을 해보자.

아무것도 입력하지 않고 로그인 버튼을 누르면 사용자 이름과 비밀번호가 필수 항목이라고 나온다. 현재 로그인이 가능한 사용자는 초반에 만들었던 슈퍼유저 admin 하나밖에없다. 그때 만들었던 슈퍼유저를 사용해 id 에 admin 비밀번호에 1111을 입력해 로그인을 하자.

로그인에 성공하면 오류가 나온다. 오류메세지를 보면 알수있듯이 로그인에 성공해 http://localhost:8000/accounts/profile/ 로 가야하는데 아직 해당 페이지가 구성되어있지 않기 때문이다. 하지만 /accounts/profile/ 은 내가 파이보에 구성한 URL 구조와 맞지 않으므로 로그인 성공시 / 페이지로 이동할 수 있도록 projects\mysite\config\settings.py 를 다음과 같이 수정하자.

마지막 줄에 추가하면 된다.

이렇게 수정해도 다음과 같은 오류가 발생한다.

이번에는 수정해서 로그인에 성공하면 http://localhost:8000/ 페이지로 가야하지만 아직 해당페이지에 대한 URL 매핑 규칙을 작성하지 않았다. 이를 추가하기 위해 projects\mysite\config\urls.py 에 다음과 같이 수정하자.

이제 / 페이지 요청에 대해 path('', views.index, name='index') 가 작동하여 pybo/views.py 파일의 index 함수가 실행된다.

이제 로그인에 성공하면 정상적으로 작동한다. 하지만 로그인을 했음에도 로그인 버튼이 로그아웃버튼으로 바뀌지 않고 여전히 로그인 버튼으로 남아있다. 이를 해결하기위해 proejcts\mysite\templates\navbar.html 을 다음과 같이 수정하자.

{% if user.is_authenticated %} 은 현재 사용자가 로그인 되어있는지를 판별한다. 로그인되어있는지를 판별하고 로그인 되어있으면 '로그아웃' 링크를 표시하고 아니면 '로그인' 링크를 표시한다. 로그인 상태에서는 로그아웃 링크에 사용자명을 의미하는 {{ user.username }} 도 추가로 표시한다.

로그아웃 링크가 추가되었으므로 {% url 'common:logout' %}에 대응하는 URL 매핑을 추가해야한다. projects\mysite\common\urls.py 파일을 다음과 같이 수정하자.

이제 잘 되어있는지 확인해보자.

잘 적용되어있다. 로그아웃 시 이동할 위치도 projects\mysite\config\settings.py 파일에 추가하자.

그리고 이제 로그아웃을 다시 해보면 / 페이지로 이동한다.

'Django > 따라하는 장고' 카테고리의 다른 글

20. author 속성  (0) 2022.11.16
19. 회원가입  (0) 2022.11.10
17. 템플릿 필터 및 답변 개수 표시  (0) 2022.11.07
16. Paginator  (0) 2022.11.05
15. 네비게이션 바  (0) 2022.11.04