django 012 | User 인증
User 확장 & 인증 (로그인, 로그아웃)
(1) django User 확장
- 각 사용자마다 할당되는 테이블들이 각기 다르다 (인스타그램에서 사람마다 게시물이 다르게 나타남)
- django는 이러한 user 테이블들을 제공
- 이는 우리가 만든 페이지의 /admin의 user에서 볼 수 있음 (들어가면 등록된 사용자들이 존재)
- 안에 들어가면 주어져있는 기본형식이 있는데 우리가 칼럼을 추가해서 (에브리타임이라면 소속 대학교명, 쇼핑몰이라면 위치 등..) user로부터 요구하고 싶은 정보 추가적으로 얻기 가능
=> 어떻게 user을 우리가 원하는 대로 만드는가?
- 이 user form을 우리가 원하는 대로 바꿔치기 하면 된다
- 그렇다고 얘를 지우는 것 X, 얘를 상속받아서 하는 것
- 우선 위의 저 USER을 f10 눌러보면
- 얘로 이동하는데 이 안에 username과 같은 초기의 정보들이 존재
- 이 abstractModel에서 칼럼들이 지정되어 있음을 볼 수 있음
- 더 깊이 들어가서 abstractUser의(AbstractBaseUser) 부분을 f10 눌러보면
- 이 친구는 우리에게 익숙한 models.py를 상속받은 친구임을 추측할 수 있음
- 밑에 내려보면
-
위 사진과 같이 저장기능 등등이 존재
-
우리가 할 것은 이제 AbstractUser을 상속받는데, 우리가 원하는 기능들도 추가(확장)해서 상속받는 것
=> user을 대체할 클래스 만들고
=> user에 컬럼들 추가해서 기존에 제공받던 user에서 추가적으로 우리가 커스터마이징 하는 것
(2) 장고에서 제공해주는 auth
- authentication : 인증
회원가입 및 로그인 과정
- 회원이 회원가입 요청하면 서버는 이 정보를 저장
- 회원은 서버에 후에 로그인을 요청
- 로그인 요청을 하고 맞다면 서버는 사용자에게 token을 준다(중요한 열쇠)
- 이 토큰을 가지고 서버에 요청을 하면
- 해당 사용자에 맞는 정보를 제공해주는 것
장고의 로그인, 로그아웃 방식
근데 장고에서 token을 실제로 제공해주는게 아닌 함수로 이 기능들을 구현한다
1) authenticate :
사용자가 입력한 정보가 usertable에 있는 것이 맞는지 확인
2) login :
사용자 확인이 되면 user 인증받게 해주는 것
3) 로그인이 완료되면 request 보낼 때마다 요청에 user 정보가 들어가게 된다
4) 서버는 요청하는 user 정보에 따라 해당 user에 대한 응답을 준다
5) logout :
인증을 이제 끊어달라는 것
실습
- account 담당해주는 새로운 앱을 제작
python manage.py startapp account
- settings.py에 앱 등록했다고 알려주기
'account',
=> 이때 우리는 새로운 걸 만드는 게 아니라 기존의 아이 상속받는 거라 models.py는 안건드림
3. views 건드려주기
(1) views.py 맨위에 import 추가
from django.contrib.auth.forms import AuthenticationForm, UserCreationForm
=> 이때 auth~ 아이는 로그인, 후자는 회원가입
(2) def login 만들기
def login_view(request):
form=AuthenticationForm
return render(request, 'login.html',{'form' : form})
- urls 수정
- 블로그 url에 있는 애들 복사
from django.urls import path
from .views import *
urlpatterns = [
- urls 붙여넣기 & login path 만들기
urlpatterns = [
path('login/', login_view, name="login"),
]
- 이 url을 프로젝트 폴더안의 urls.py와 연결햐주가
path('account/', include('account.urls')),
- app에서 이제 html 보여줄 template 설정
(1) new.html에 있는 애 복붙
{% extends 'base.html' %}
{% block content %}
<h1>새로운 글 작성</h1>
<form action ="{% url 'create' %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
<table>
{{form.as_table}}
</table>
</form>
{% endblock %}
</body>
</html>
(2) 수정
- action 은 다른 url로 들어가야하니 삭제 / encoding 타입이 이미지 없어서 필요없어 삭제
{% extends 'base.html' %}
{% block content %}
<h1>Login</h1>
<form action ="" method="post">
{% csrf_token %}
{{form.as_p}}
<button type="submit">로그인</button>
</form>
{% endblock %}
</body>
</html>
- urls로 요청을 보내야 할 a 태그가 필요 - nav 바에 링크 연결 => base.html 수정하러가기
<a class="nav-link active" aria-current="page" href="{% url 'login' %}}">Login</a>
- 서버 돌린 후 새로 생긴 로그인 버튼 누르면
로그인창이 잘 보인다
- views.py 에 로그인 & 로그아웃 함수 구체화
(0) import 같은 아이들 잘해주기
from django.contrib.auth import authenticate, login, logout
#auth에서 로그인, 로그아웃 함수들 import 해오기
- from django.contrib.auth 에서 데려오는 것은 로그인, 아웃 과정에서 essential
(1) 로그인 함수**
def login_view(request):
if request.method=='POST':
form=AuthenticationForm(request=request, data = request.POST)
if form.is_valid(): #유효성 검사해서 통과된 데이터 =cleaned data
username=form.cleaned_data.get("username")
password=form.cleaned_data.get("password")
user = authenticate(request=request, usernmae=username, password=password )
if user is not None : #USER가 없는게 아니라면(즉 테이블에 존재하는 상태라면)
login(request,user) #이 로그인 기능을 위해 auth에서 로긔인 기능 import
return redirect('home')
else :
form=AuthenticationForm()
return render(request, 'login.html', {'form':form})
-
만약 사용자가 로그인 폼을 눌렀을 때 방식이 POST방식이 맞다면
-
form 변수 안에 로그인 폼을 할당받아주기
-
그리고 유효성 검사(if form.is_valid) 해서 통과된 데이터를 cleaned 데이터라고 함
-
이 클린데이터에서 username, password 가져오기
-
user라는 객체는 여기서 인증을 받아오는 객체 user = authenticate(request=request, usernmae=username, password=password ), form에서 받아온 아이들을 받아와서 인증해주는 역할을 수행
-
auth에 있는 로그인 모듈을 import 받아서 로그인기능 수행
-
성공하나 실패하나 둘다 home으로 redirect할거라서 얘는 인덴트 적절히 조절
-
else : 아니라면 다시 로그인 폼을 보여주기
(2) 로그아웃 함수
def logout_view(request):
logout(request)
return redirect("home")
- 로그아웃 모듈 사용하면 끝임
- urls 에 로그아웃도 추가
path('logout/', logout_view, name="logout"),
- 로그아웃 a 태그도 추가
<a class="nav-link" href="{% url 'logout' %}}">Logout</a>
- login.html에 form action="{ url 'login' }" 추가
{% extends 'base.html' %}
{% block content %}
<h1>Login</h1>
<form action ="{% url 'login' %}" method="post">
{% csrf_token %}
{{form.as_p}}
<button type="submit">로그인</button>
</form>
{% endblock %}
</body>
</html>
(+) 로그인 여부 판별 위해 파이썬 문법 {% if user.is_authenticated %} 사용
{% if user.is_authenticated %}
{{user.username}}
{% endif %}
결과
로그인 성공 후
로그아웃 누른 후
Debugging
def login_view(request):
form=AuthenticationForm
return render(request, 'login.html',{'form' : form})
=> 'form' : form 형태로 써줘야 하는데- 로 이어줘서 오류났었음
Author And Source
이 문제에 관하여(django 012 | User 인증), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@myway00/django-012-User-확장-인증저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)