Westagram 회원가입 API를 만들기 위해서는 우선적으로 ERD를 설계를 해야한다.
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"
models.py에서 설계한 ERD를 migrate 하여 DB에 적용한다.
회원가입을 할 때 사용할 수 있는 이메일과 비밀번호의 조건을 만든다(유효성 검사). 해당 조건에 맞지 않으면 오류가 발생하게 만든다.
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')
- [a-zA-z0-9+-_.]: @ 앞은 영어, 숫자, -. 가 사용가능하다.
- [a-zA-Z0-9-]: 영어, 숫자, -. 가 사용가능하다
- \. : .이 사용되어야 한다.
- [a-zA-Z0-9.]+$ : 영어, 숫자, . 이 사용 가능하며 끝난다.
(?=.*[A-Za-z]): 영어가 있어야 하며
(?=.*\d): 숫자도 있어야 하고
(?=.*[$@$!%*#?&]): 특수문자도 있어야 하며
[A-Za-z\d$@$!%*#?&]{8,}: 그 모든 문자가 8자 이상이어야 한다.
위에서 만든 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)