django 012 | User 인증

21566 단어 djangodjango

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 :
인증을 이제 끊어달라는 것


실습

  1. account 담당해주는 새로운 앱을 제작
python manage.py startapp account
  1. 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})
  1. urls 수정
  • 블로그 url에 있는 애들 복사
from django.urls import path
from .views import *
urlpatterns = [
  1. urls 붙여넣기 & login path 만들기
urlpatterns = [
    path('login/', login_view, name="login"),
]
  1. 이 url을 프로젝트 폴더안의 urls.py와 연결햐주가
    path('account/', include('account.urls')),
  1. 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>
  1. urls로 요청을 보내야 할 a 태그가 필요 - nav 바에 링크 연결 => base.html 수정하러가기
<a class="nav-link active" aria-current="page" href="{% url 'login' %}}">Login</a>
  1. 서버 돌린 후 새로 생긴 로그인 버튼 누르면

로그인창이 잘 보인다

  1. 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")
  • 로그아웃 모듈 사용하면 끝임
  1. urls 에 로그아웃도 추가
    path('logout/', logout_view, name="logout"),
  1. 로그아웃 a 태그도 추가
<a class="nav-link" href="{% url 'logout' %}}">Logout</a>
  1. 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 형태로 써줘야 하는데- 로 이어줘서 오류났었음

좋은 웹페이지 즐겨찾기