어떤 웹을 만들던 인증 기능은 빼놓을 수 없다. 아무나 글을 수정하거나 지우면 안 되니까!
우리의 친절한 django는 이러한 중요 기능을 기본적으로 제공하고 있다. 오늘도 개발자 만세!
인증 기능을 담당하는 앱은 django 패키지의 django.contrib.auth ← 요 녀석이다.
해당 앱은 User라는 모델 클래스를 기본적으로 제공하고 있는데, User 테이블의 구조는 다음과 같다.
필드명 | 타입 | 제약 조건(default) | 설명 |
id | Integer | PK, Auto Increment | 기본 키 |
Username | CharField(30) | Unique | 로그인 이름 |
first_name | CharField(30) | Blank | 사용자 이름 |
last_name | CharField(30) | Blank | 사용자 성 |
CharField(254) | Blank | 이메일 주소 | |
is_staff | BooleanField | False | 스태프 여부 |
is_active | BooleanField | True | 계정 활성화 여부 |
date_joined | DateTimeField | timezone.now | 계정 생성 시간 |
password | CharField(128) | 비밀번호 | |
last_login | DateTimeField | Blank, Null | 마지막 로그인 시간 |
is_superuser | BooleanField | False | 관리자(superuser) 여부 |
groups | ManyToManyField | Blank | 사용자가 속한 그룹 |
user_permissions | ManyToManyField | Blank | 사용자에게 부여된 권한 |
또한 django의 인증 기능에는 URL과 뷰도 이미 개발되어 있으며, 템플렛 파일명도 정해져 있다.
USL 패턴 | 뷰 이름 | 템플릿 파일명 |
/login/ | LoginView(FormView) | registration/login.html |
/logout/ | LogoutView(TemplateView) | registration/logged_out.html |
/password_change/ | PasswordChangeView | registration/password_change_form.html |
/password_change/done/ | PasswordChangeDoneView(Templateview) | registration/password_change_done.html |
/password_reset/ | PasswordResetView(FormView) | registration/password_reset_form.html registration/password_reset_email.html registration/password_reset_subject.txt |
/password_reset/done/ | PasswordResetDoneView(TemplateView) | registration/password_reset_done.html |
/reset/<uidb64>/<token>/ | PasswordResetConfirmView(FormView) | registration/password_reset_confirm.html |
/reset/done/ | PasswordResetCompleteView(TemplateView) | registration/register.html |
/register | UserCreateView(CreateView) | registration/register.html |
/register/done/ | UserCreateDoneTV(TemplateView) | registration/regitster_done.html |
이 중 아래 2개, 즉 회원 가입(register) 기능은 제공하지 않으므로 코딩을 직접 해야 한다.
1. settings.py 작성
로그인&로그아웃과 관련해 settings.py에서 url 지정을 해줘야 한다.
- LOGIN_URL : 로그인 페이지로 redirect 시킬 때 사용하는 URL! 별도로 지정하지 않으면 default로 /accounts/login/URL 을 사용한다. → 여기서는 default 값을 사용.
- LOGIN_REDIRECT_URL : 로그인을 성공한 후 redirect 시킬 때 사용하는 URL! 별도 지정 없이는 /accounts/profile/URL 을 사용한다. → 지정해주자!
- LOGOUT_REDIRECT_URL : 로그아웃을 성공한 후 redirect 시킬 때 사용하는 URL! → 굳이 필요는 X
settings.py
settings.py 하단에 이렇게 지정해주자!
또한 폼을 사용하는데 유용한 django-widget-tweaks 앱도 등록해주자.
앱 등록도 빼먹지 말자!
어라라. 그런데 등록된 앱들 중 익숙한 이름이 보인다.
띠용. 별도로 등록해준 적도 없는데. django를 처음 설치했을 때 이렇게 기본적으로 깔려있는 녀석이었다.
2. model 작성
인증 기능에 필요한 모델은...? django에서 기본적으로 제공하고 있다!
처음 Blogs앱을 만들었을 때 migrate로 데이터베이스에 반영도 시켜줬었다.
즉 할 게 없다! 야호!
3. URL 작성
앞서 말한 것처럼 인증에 필요한 URL 역시 django에서 기본적으로 제공 중.
따라서 이를 include 함수로 가져와서 사용하면 된다!
urls.py
django.contrib.auth.urls를 가져와서 사용했다.
이때 유의할 점. 요 URLconf에는 /login/, /logout/처럼 url이 정의되어 있다.
따라서 URL 추가를 원한다면 앞에 이를 적어줘야 한다.
현재는 accounts/ 를 붙였기 때문에 로그인에 필요한 url은 /accounts/url, 로그아웃은 /accounts/logout 이 된다.
하단의 2개는 위에서 말한 회원가입에 해당하는 부분!
위에서부터 계정을 생성하는 url, 계정 생성 완료 화면을 띄워주는 url이다.
이는 우리가 직접 작성한 것!
4. view 작성
LoginView 처럼 django auth 모듈에서 제공하는 뷰는... 따로 코딩할 필요가 없다!
왜? django 실행 시 settings.py에 등록된 auth 모듈 안에 있는 views.py 가 활성화되기 때문!
즉 우리는 auth 모듈에 없는, 가입 처리용 뷰인 UserCreateView와 UserCreateDoneTV를 작성해주면 된다.
이는 특정 앱에 포함된 기능이 아니므로 프로젝트 파일의 views.py에!
views.py
우선 기존에 있던 TemplateView 이외에 CreateView도 import 해준다.
CreateView는 또 뭐시여?
요 녀석은 테이블에 새로운 레코드를 생성하기 위해, 이에 필요한 form을 보여주고,
form에 입력된 데이터로 테이블 레코드를 생성해주는 뷰...라고 한다. 꼴까닥.
다음은 UserCreationForm을 import!
역시나 django에서 기본으로 제공하며, User 모델의 객체를 생성하기 위해 보여주는 form이다.
마지막으로 reverse_lazy인데...
reverse와 흡사하지만 views 모듈이 로딩될 때 url 모듈이 로딩되지 않을 수 있으므로 잠시 기다리는...? 개념이란다.
맞다! 무슨 소린지 잘 모르겠다!
우선 계정을 생성하는 UserCreateView → 클래스형 뷰인 CreateView를 사용했다.
CreateView는 레코드 생성을 위한 form을 보여주고, 입력된 데이터로 레코드를 생성해준다!
즉 이러한 form을 띄워줄 템플릿, 띄워줄 form, 성공 시 url을 지정해주면 된다.
UserCreateDoneTV는? 계정 완료를 알리는 페이지를 단순히 띄워주는 역할!
5. templates 작성
1) base.html
로그인 관련 화면은 모든 페이지에 공통적으로 들어갈 예정이다.
따라서 base.html에 이러한 내용을 띄워주자!
base.html
if문을 써서 user가 is_active, 즉 로그인 여부를 확인한다.
궁금증 2가지. user랑 is_active는 어디서 튀어나온 것??
user객체는 django의 기본 템플릿 변수다! 즉 어떤 템플릿에서라도 사용할 수 있단 말씀.
is_active는 아아아까 위에서 본 User 테이블의 기본값들 중 하나! default로 True를 반환한다.
따라서 if user.is_active가 True라면 사용자가 로그인한 상태라는 것!
이렇게 로그인 한 상태라면 username을 띄워주고, 로그아웃과 비밀번호 변경 href도 걸어주자.
else, 즉 로그인하지 않은 상태라면? 로그인과 회원가입 href를 띄워준다!
쨘. 로그인 여부에 따라 이렇게 표시된다.
(아직 회원가입을 구현하지 않았으므로 superuser 계정으로 로그인 해 확인해보면 된다)
2) login.html
다음은 로그인 화면을 보여주는 login.html을 만들자.
역시 특정 앱에 포함된 페이지가 아니므로 프로젝트 파일 - registraion폴더 내에 생성!
login.html
일단 로그인을 위해 form 태그를 만들자! csfr_token은 이제 기본.
{{form.username}} 이 보이는데... 이 form의 정체는?
바로 LoginView에서 넘겨주는 AuthenticationForm의 객체란다!
그럼 AuthenticationForm은 또 뭔디? 얘도 django에서 제공하는 로그인용 기본 form이라고 한다.
아하! 즉 로그인을 담당하는 AuthenticationForm에 username과 password를 작성해 제출하는 것!
밑에서 form 제출 시 {{next}}란 녀석을 할당해주는데... 요놈은 또 뭘까.
next 역시 LoginView에서 넘겨주는 context 변수라고 한다.
즉 이를 통해 LoginView과 POST 요청을 처리한 후(로그인이 성공한 후),
{{next}} 변수로 지정된 URL로 이동시켜준다고 한다...
물음표 덩어리다!!!
그 밑의 {% if form.errors %}, 즉 로그인 form에 errors 가 있을 경우, {{form.errors}} 해당 에러를 띄워준다.
각각 로그인 , 로그인 완료, 로그인 에러 페이지!
3) register.html
register.html
login.html과 크게 달라진 점은 없다.
다만 유의할 점. 여기에 등장하는 form은 위의 AuthenticationForm이 아니다!!!
요 녀석은 바로 UserCreateView에서 보내준 form_class인 UserCreationForm인 것!
username, password1, password2 역시 이 UserCreationForm에 정의된 속성이다.
4) register_done.html
register_done.html
크...게 설명할 내용은 없다!
회원가입 후 바로 로그인을 할 수 있도록 href를 걸어줬다.
5) password_change_form.html
password_change_form.html
역시 크......게 설명할 내용은 없다!
단 여기서 등장하는 form은! django에서 기본으로 제공하는 PassWordChangeForm이라는 사실.
6) password_change_done.html
password_change_done.html
간단해서 좋다.
7) logged_out.html
logged_out.html
로그아웃이 완료되면 띄워주는 페이지!
역대급으로 많은 html 파일을 만들었다.
클래스형 뷰와 django auth모듈을 사용하니 코드 적성은 정말로 간편하다.
하지만 아주 아주 큰 문제점. 보기가 너무 안 좋다!!!
필요한 부분은 함수형 작성 or 오버라이딩을 통해 수정해주면 좋겠는데...
이게 또 쉽지 않은 길이다. 흑흑흑.
'source-code > Django' 카테고리의 다른 글
Blogs App _ CRUD with 함수형 (0) | 2021.01.06 |
---|---|
Blogs App _ CRUD (0) | 2021.01.05 |
Blogs App _ 검색 기능 (0) | 2021.01.04 |
Blogs App _ 댓글 기능 (0) | 2021.01.02 |
Blogs App _ tag 기능 (0) | 2021.01.01 |