본문 바로가기
Django/Django Vanila

6. Django에서 제공하는 사용자 기능

by S.T.Lee 2022. 5. 27.

처음부터 createsuperuser로 admin 페이지에 접근할 수 있는것은 Django 자체에서 'User모델'과  '로그인/로그아웃'을 제공하기 때문이다.

 

1. auth_user(기본 제공) vs my_user(커스텀)

auth vs my

기본 제공 모델이랑 커스텀 모델이랑 차이가 나는것이 보인다.

그래서 기본 제공 모델을 상속 받아서 커스텀 모델을 만들고자 한다.

 

2. 커스텀 User모델 수정하기

#user/models.py
from django.db import models
from django.contrib.auth.models import AbstractUser #Django의 유저 생성 모델을 임포트한다

class UserModel(AbstractUser): #임포트 받은 기본 유저 모델을 상속하고
    class Meta:
        db_table = "my_user"

    bio = models.CharField(max_length=256, default='') #없는 bio만 추가해준다

이후 Project/settings.py에 커스텀 유저 모델을 만든것을 알려줘야한다.

AUTH_USER_MODEL = 'user.UserModel'

맨 마지막 줄에 작성을 해주면 Django가 인식을 한다.

 

이제 db에 적용을 해줘야한다.

python manage.py makemigrations
python manage.py migrate

바뀐 커스텀 모델을 비교해보자

커스텀 모델 바꾸기 전 vs 바꾼 후
기본 제공 모델 vs 커스텀 모델

코드와 같이 기본 모델에서 bio만 추가된것을 볼 수 있다.

 

3. 회원가입 수정

#user/views.py
from django.shortcuts import render, redirect
from .models import UserModel
from django.http import HttpResponse
from django.contrib.auth import get_user_model #사용자가 데이터베이스 안에 있는지 검사하는 함수

# Create your views here.
def sign_up_view(request):
    if request.method == 'GET':
        return render(request, 'user/signup.html')
    elif request.method == 'POST':
        username = request.POST.get('username', None)
        password = request.POST.get('password', None)
        password2 = request.POST.get('password2', None)
        bio = request.POST.get('bio', None)

        if password != password2:
            return render(request, 'user/signup.html')
        else:
            # old_user = UserModel.objects.filter(username=username)
            old_user = get_user_model().objects.filter(username=username)
            if old_user:
                return render(request, 'user/signup.html')
            else:
                # new_user = UserModel()
                # new_user.username = username
                # new_user.password = password
                # new_user.bio = bio
                # new_user.save()
                UserModel.objects.create_user(
                    username=username,
                    password=password,
                    bio=bio
                ) #Django에서 기본적으로 제공하는 함수로 계정을 바로 만들 수 있다.
                return redirect('/sign-in')

 

자 이제 서버를 켜서 작동을 시키면 회원가입 후 로그인 페이지로 넘아가질 것이다.

근데 로그인은 안된다. 이유는 무엇일까?

아직은 모르겠으나 db를 보면 바뀐게 보인다.

아이디가 암호화 되어서 보이고 나중에 생성된 계정의 비밀번호는 애시당초 암호화 되어있다.

이를 통해 암호화된 비밀번호를 다시 풀어주는 기능이 없어서 그런게 아닐까 하는 추측이 선다.

def sign_in_view(request):
    if request.method == 'POST':
        username = request.POST.get('username', None)
        password = request.POST.get('password', None)

        me = UserModel.objects.get(username=username)
        if me.password == password:
            request.session['user'] = me.username
            return HttpResponse(f'{me.username} 로그인에 성공하셨습니다!')
        else:
            return redirect('/sign-in')

    elif request.method == 'GET':
        return render(request, 'user/signin.html')

근데 암호화한 시점은 처음부터인데 지금것만 암호화가 된걸까?

 

4. 로그인 수정

#user/views.py
from django.shortcuts import render, redirect
from .models import UserModel
from django.http import HttpResponse
from django.contrib.auth import get_user_model #사용자가 데이터베이스 안에 있는지 검사하는 함수
from django.contrib import auth

# Create your views here.
def sign_in_view(request):
    if request.method == 'POST':
        username = request.POST.get('username', None)
        password = request.POST.get('password', None)

        # me = UserModel.objects.get(username=username)
        me = auth.authenticate(request, username=username, password=password) #authenticate 암호화된 비빌번호와 입력된 비밀번호가 맞는지 그리고 사용자와 맞는지 확인을 해준다.
        # if me.password == password:
        #     request.session['user'] = me.username
        if me is not None:
            auth.login(request, me) #login은 Django가 user id를 session에 저장하게 해준다
            return HttpResponse(f'{me.username} 로그인에 성공하셨습니다!')
        else:
            return redirect('/sign-in')

    elif request.method == 'GET':
        return render(request, 'user/signin.html')

마음같아서는 auth가 import 되었기에 auth.get_user_model로 바꾸고 싶으나 일단 쫓아가보도록 하자

그런게 어딨어! 코드를 바꿔놓겠다

#user/views.py
from django.shortcuts import render, redirect
from .models import UserModel
from django.http import HttpResponse
from django.contrib import auth

# Create your views here.
def sign_up_view(request):
    if request.method == 'GET':
        return render(request, 'user/signup.html')
    elif request.method == 'POST':
        username = request.POST.get('username', None)
        password = request.POST.get('password', None)
        password2 = request.POST.get('password2', None)
        bio = request.POST.get('bio', None)

        if password != password2:
            return render(request, 'user/signup.html')
        else:
            old_user = auth.get_user_model().objects.filter(username=username)
            if old_user:
                return render(request, 'user/signup.html')
            else:
                UserModel.objects.create_user(
                    username=username,
                    password=password,
                    bio=bio
                )
                return redirect('/sign-in')


def sign_in_view(request):
    if request.method == 'POST':
        username = request.POST.get('username', None)
        password = request.POST.get('password', None)

        me = auth.authenticate(request, username=username, password=password)
        if me is not None:
            auth.login(request, me)
            return HttpResponse(f'{me.username} 로그인에 성공하셨습니다!')
        else:
            return redirect('/sign-in')

    elif request.method == 'GET':
        return render(request, 'user/signin.html')

정상 작동하는지 확인해보자

다시 우선 회원가입

잘 만들어졌고 다음 로그인

잘 된다!

'Django > Django Vanila' 카테고리의 다른 글

8. Django 게시글 쓰기  (0) 2022.05.27
7. Django 로그인 이후 기능  (0) 2022.05.27
5. Django 사용자 관리와 로그인  (0) 2022.05.26
α. 기타 Django 상황들(VsCode, 오류 등)  (0) 2022.05.26
4. Django admin  (0) 2022.05.26