회원가입 view 코드
#views.py
import json
import bcrypt
import jwt
from django.http import JsonResponse
from django.core.exceptions import ValidationError
from django.views import View
from django.conf import settings
from users.models import User
from users.validator import validate_email, validate_password
회원가입 api를 작성하기 위해 view파일에 import 해주어야 할것들이다.
class SighUpView(View):
def post(self, request):
try:
data = json.loads(request.body)
username = data['username']
first_name = data['first_name']
last_name = data['last_name']
email = data['email']
password = data['password']
phone_number = data['phone_number']
post 메소드를 사용해 api를 구현해보자.
json형식으로 입력받을 데이터들을 작성하였다.
validate_email(email)
validate_password(password)
email과 password의 정규식 유효성 검사를 진행한다.
정규식 유효성 검사는 validate함수를 선언하여 모듈화 시켜두었다.
#validator.py
import re
from django.core.exceptions import ValidationError
def validate_email(email):
EMAIL_REGEX = re.match('^[a-zA-z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9.]+$', email)
if not EMAIL_REGEX:
raise ValidationError(message="INVALID_EMAIL")
def validate_password(password):
PASSWORD_REGEX = re.match('^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$', password)
if not PASSWORD_REGEX:
raise ValidationError(message="INVALID_PASSWORD")
email은 @와 .을 포함하는 이메일 형식을, password는 (대소문자를 가리지 않는)영문자,숫자,특수문자를 필수로하는 8자리이상을 요구하는 정규식을 이용해 함수를 작성하였다.
각자 유효성검사에 실패할경우 ValidationError를 발생시켰다.
if User.objects.filter(email = email).exists():
return JsonResponse( {"message" : "Email Already Exists"}, status = 400)
hashed_password_decoded = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
이메일 중복 유효성 검사와 password 암호화코드이다.
user table에 입력받은 데이터와 같은 값의 email 데이터가 존재할경우 400에러를 반환해준다.
입력받은 password를 bcrypt를 사용해 암호화 시켜보았다.
hashpw를 해서 암호화한 값을 decode해둔다.
User.objects.create(
username = username,
first_name = first_name,
last_name = last_name,
email = email,
password = hashed_password_decoded,
phone_number = phone_number
)
return JsonResponse({"message": "SIGHUP SUCCESS"}, status=201)
except KeyError:
return JsonResponse({"message" : "KEYERROR"}, status = 400)
except ValidationError as error:
return JsonResponse({"message" : error.message}, status = 400)
이제 User table에 데이터들을 생성해준다.
모든 절차가 문제없이 진행되었으면 201 status를 반환해준다.
KeyError가 발생하였을경우, 400 status를 반환하는 예외처리를 해두었다.
그리고 ValidationError가 발생할 경우 저장해두었던 메세지와 함께 400 status를 반환하는 예외처리를 작성해두었다.