[django]회원가입 및 로그인 연습

전예찬·2022년 4월 21일

django로 회원가입 및 로그인을 구현해 봅시다!!

먼저 장고 기본적인 초기세팅을 해주었습니다.

그이후 feature/users 라는 브랜치를 생성해서 이 브랜치에서 작업을 해줄것 입니다...

1. Application생성

회원가입과 로그인을 구현하기 위한 어플리케이션을 생성해 줍시다~
python manage.py startapp users 명령어를 입력해줍니다.

그러면 users앱이 생성된 것을 보실수 있습니다.

이후 setting.py에 가셔서 INSTALLED_APPS에 'users'를 축가해 줍니다.

2. Model 작성

자 이제 모델을 작성해 줄 차례입니다.
users 폴더안에 models.py에 작성을 해줍니다.

from django.db import models

class User(models.Model):
    username     = models.CharField(max_length=50)
    email        = models.CharField(max_length=100, unique=True) #하나의 email에 하나의 계정만 만들기 위해 uique를 사용하였습니다.
    password     = models.CharField(max_length=50)
    phone_number = models.CharField(max_length=50)
    ect_info     = models.CharField(max_length=200, null=True) #추가 정보는 필수 정보가 아니기 때문에 null을 추가하었습이다.
    created_at   = models.DateTimeField(auto_now_add=True) 
    updated_at   = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'users'

모델을 작성해 줬다면 데이터베이스에 모델정보를 전달해 줍니다.

python code를 database에 적용하기 위한 migration 파일(설계도)를 만들어 줍니다.
python manage.py makemigrations users을 입력해 줍니다.

이제 makemigration으로 생성한 migration 파일(설계도)을 database에 적용해 줍시다.
python manage.py migrate 을 입력해 줍니다.

그럼 이제 데이터베이스에 모델의 정보가 잘들어 갔는지 확인해 보겠습니다.

잘 들어 갔네요~~

3. 회원가입을 위한 View작성

이제 회원가입 기능구현을 위해 view를 작성해 줍니다.

import json, re, bcrypt

from django.http  import JsonResponse
from django.views import View

from users.models import User

class SignUpView(View):
    def post(self, request):
        try:
            data  = json.loads(request.body)
            user_name      = data['user_name']
            email          = data['email']
            password       = data['password']
            phone_number   = data['phone_number']
            ect_info       = data['ect_info']
            regex_email    = '^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9_-]+\.[a-zA-Z0-9-.]+$'
            regex_password =  "^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$"

            if not re.match(regex_email,email):
                return JsonResponse({'message' : 'INVALID_EMAIL'}, status=400)
            if not re.match(regex_password,password):
                return JsonResponse({'message' : 'INVALID_PASSWORD'}, status=400)
            if User.objects.filter(email=email).exists():
                return JsonResponse({'message':'email_already_exists'}, status=400)
            
            User.objects.create(
                user_name    = user_name,
                email        = email,
                password     = bcrypt.hashpw(password.encode('utf-8'),bcrypt.gensalt()).decode('utf-8'),
                phone_number = phone_number,
                ect_info     = ect_info,
            )
            return JsonResponse({'message' : 'SUCCESS'}, status=201)
        except KeyError:
            return JsonResponse({"message":"KEY_ERROR"}, status=400)

정규식을 이용하여 email과 password의 특수한 조건에 해당할수 있게 해줍니다.
password는 데이터베이스에 들어가기 전에 암호화 해준 다음에 넣어줍니다.

4. 로그인을 위한 View작성

class SignInView(View):
    def post(self, request):
        try:
            data = json.loads(request.body)
            user = User.objects.get(email=data['email'])

            if not bcrypt.checkpw(data['password'].encode('utf-8'), user.password.encode('utf-8')):
                return JsonResponse({'message':'INVALID_USER'},status=401)

            access_token = jwt.encode({'id': user.id}, settings.SECRET_KEY, algorithm = settings.ALGORITHM)

            return JsonResponse({'access_token' : access_token,},status=200)

        except KeyError:
            return JsonResponse({'message':'KEY_ERROR'}, status=400)
        except ValueError:
            return JsonResponse({'message':'VALUE_ERROR'}, status=400)
        except User.DoesNotExist:
            return JsonResponse({'message' : 'INVALID_USER'}, status=401)

로그인에 성공하면 access_token을 리턴해 줍니다.

profile
이제 시작

0개의 댓글