Python/Django

[Django-Memo] 8. 로그인/로그아웃 처리

꼰대 2021. 6. 2. 17:50

개인의 메모를 보여주는 프로그램이므로 로그인이 필요하고 로그인 시 본인이 작성한 글만 보여야 합니다.

따라서 Memo 모델에 작성자를 추가하고 migration 해야 합니다.

 

먼저 Memo 모델에 author이란 변수이름으로 django 기본 제공 모델인 User의 ForeignKey로 추가합니다.

memo/models.py

 

이제 쉘에 makemigrations을 입력하면 아래와 같은 메시지가 나옵니다.

1번은 새로 생성된 author에 기본값을 지금 지정하겠느냐라는 옵션이고

2번은 Memo 모델에서 default 옵션을 주겠느냐라는 이야기입니다.

만약 2번을 선택하면 빠져나가고 모델로 가서 다음과 같이 수정해야 합니다.

author = models.ForeignKey(User, on_delete=models.CASCADE, default='1')

여기서는 1번은 선택해서 기본값을 지정하겠습니다.

 

이제 기본값을 넣어야 합니다. User 테이블을 보니 처음 생성한 관리자 계정의 ID가 1번이여서 '1'을 기본값으로 하겠습니다.

그러면 필드가 추가된 migration 준비가 끝났습니다.

 

 

migrate로 모델을 적용합니다.

 

django에서 기본으로 제공하는 인증 관련 App을 살펴봅니다.

config/settings.py에는 로그인을 처리해주는 'django.contrib.auth' App이 이미 설치되어 있습니다.

config/settings.py

 

로그인, 로그아웃은 공통적인 성격이 있어 common이란 이름으로 App을 생성하려 합니다.

쉘에 'django-admin startapp common'을 입력해서 App을 생성합니다.

그리고 이 프로그램에서 로그인, 로그아웃을 처리하는 App을 하나 만들겠습니다.

config/settings.py에 'common.apps.CommonConfig'를 등록합니다.

config/settings.py

 

로그인, 로그아웃 성공 시 이동할 페이지로 settings.py파일에서 지정해줍니다.

로그인 성공 시 첫 페이지로, 로그아웃 성공 시 로그인 페이지로 이동합니다.

config/settings.py

 

 

다음으로 config/urls.py에 common으로 들어오는 요청을 common/urls.py에 작성해야 합니다.

config/urls.py

 

common/urls.py을 열어 로그인, 로그아웃 path를 생성합니다.

로그인 요청 시 as_view()에서 auth App이 사용할 template 파일의 경로와 이름을 지정해줍니다.

common/urls.py

 

 

이제 templates/common/login.html 경로와 파일을 생성하고 아래와 같이 문서를 작성합니다.

여기서 include 'form_error.html'은 아이디 및 비밀번호가 잘못되었을 때 에러 메시지를 보여주는 공간입니다.

templates/common/login.html

 

위 에러 페이지는 templates/form_error.html에 아래와 같이 작성합니다.

templates/form_error.html

 

 

로그아웃은 auth App에서 처리하므로 별도로 작성할 내용은 없고 common/urls.py에 정의된 경로만 호출하면 됩니다.

templates/base.html

 

 

로그인 상태에서만 메모를 등록, 조회, 삭제가 가능하기 때문에 각 함수명 위에 애너테이션(Annotation)을 추가합니다. 이는 로그아웃 상태 (request.user가 없는 상태)라면 로그인 페이지로 이동합니다.

그리고 본인이 작성한 메모만 조회되도록 memo/views.py에 작성자 조건을 추가합니다.

memo/views.py

 

 

삭제는 메모 리스트 페이지에서 이루어지며 본인 작성 메모가 아닌 것에 대한 요청을 처리해야 합니다. 삭제 대상 메모를 불러와 작성자와 로그인 한 사람을 비교하여 다를 경우 messages 패키지를 이용해 메모 리스트 페이지에 에러 메시지를 보냅니다.

memo/views.py

 

templates/memo/memo_list.html

반응형