[Django] Westagram(1) - 회원가입 기능 구현

그냥·2022년 6월 19일
0

django

목록 보기
9/20

1. ERD 설계

Westagram 회원가입 API를 만들기 위해서는 우선적으로 ERD를 설계를 해야한다.

1) modeling

from django.db import models

class User(models.Model):
    first_name    = models.CharField(max_length=45)
    last_name     = models.CharField(max_length=45)
    user_name     = models.CharField(max_length=45, unique=True)
    email         = models.EmailField(max_length=45, unique=True)
    password      = models.CharField(max_length=200)
    mobile_number = models.CharField(max_length=45)

    class Meta:
        db_table = "users"
  • 회원정보로 6개의 정보를 받으며 user_name과, email은 unique=True로 설정하여 중복값이 없도록 하였다.

2) migration

models.py에서 설계한 ERD를 migrate 하여 DB에 적용한다.

  • python manage.py makemigrations <앱 이름>
  • python manage.py migrate


2. 회원가입

유효성 검사

회원가입을 할 때 사용할 수 있는 이메일과 비밀번호의 조건을 만든다(유효성 검사). 해당 조건에 맞지 않으면 오류가 발생하게 만든다.

validation.py

import json
import re

from django.core.exceptions import ValidationError
from django.http        import JsonResponse

def validate_email(value):
    email_regex = re.compile('^[a-zA-z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9.]+$')

    if not email_regex.match(value):
        raise ValidationError('INVALID_EMAIL_ADDREASS')

def validate_password(value):
    password_regex = re.compile('^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$')

    if not password_regex.match(value):
        raise ValidationError('INVALID_PASSWORD')
  • validateemail 함수는 이메일 유효성 검사 함수이다.
    조건: ^[a-zA-z0-9+-
    .]+@[a-zA-Z0-9-]+.[a-zA-Z0-9.]+$'
- [a-zA-z0-9+-_.]: @ 앞은 영어, 숫자, -. 가 사용가능하다.
- [a-zA-Z0-9-]: 영어, 숫자, -. 가 사용가능하다
- \. : .이 사용되어야 한다.
- [a-zA-Z0-9.]+$ : 영어, 숫자, . 이 사용 가능하며 끝난다.

  • validate_password 함수는 비밀번호 유효성 검사 함수이다.
    조건: ^(?=.[A-Za-z])(?=.\d)(?=.[@@!%#?&])[A-Za-z\d@@!%*#?&]{8,}$
(?=.*[A-Za-z]): 영어가 있어야 하며
(?=.*\d): 숫자도 있어야 하고
(?=.*[$@$!%*#?&]): 특수문자도 있어야 하며
[A-Za-z\d$@$!%*#?&]{8,}: 그 모든 문자가 8자 이상이어야 한다.


POST

위에서 만든 validation.py를 import 하여 SignUp 기능을 만들 때 사용한다.

views.py

class SignUp(View):
    def post(self, request):
        try :
            data = json.loads(request.body)
            first_name    = data['first_name']
            last_name     = data['last_name']
            user_name     = data['user_name']
            email         = data['email']
            password      = data['password']
            mobile_number = data['mobile_number']

            validate_email(email)
            validate_password(password)
            
            if User.objects.filter(email = email).exists():
                return JsonResponse({'MESSAGE' : 'ALREADY_EXISTS_EMAIL'}, status=400)
            
            if User.objects.filter(user_name = user_name).exists():
                return JsonResponse({'MESSAGE' : 'ALREADY_EXISTS_USER_NAME'}, status=400)

            hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
            decoded_password = hashed_password.decode('utf-8')

            User.objects.create(
                first_name    = first_name,
                last_name     = last_name,
                user_name     = user_name,
                email         = email,
                password      = decoded_password,
                mobile_number = mobile_number
            )
        
            return JsonResponse({'MESSAGE' : 'SUCCESS'}, status = 201)
        
        except KeyError:
            return JsonResponse({'MESSAGE' : 'KEY_ERROR'}, status = 400)

        except ValidationError as e:
            return JsonResponse({"MESSAGE" : (e.message)}, status = 400)
  • request를 통해서 받아야 할 데이터 양식을 만든다.
  • validated_email, validate_password 함수를 통해서 이메일, 패스워드 유효성 검사를 한다.
  • if User.objects.filter(email = email).exists() 와 if User.objects.filter(user_name = user_name).exists() 를 통해서 이미 있는 email이거나 user_name에 대해서 필터링을 한다.
  • hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()) 를 통해서 인코딩한 password를 암호화 한다.
  • decoded_password = hashed_password.decode('utf-8') 를 통해서 암호화된 password를 디코딩을 하여 문자열로 DB에 저장한다.

0개의 댓글

관련 채용 정보