# users/views.py
import json
import bcrypt
from django.http import JsonResponse
from django.views import View
from users.validation import validate_email, validate_password
from users.models import User
class SignUpView(View):
def post(self, request):
data = json.loads(request.body)
try:
# get으로 데이터를 받아오면 key를 잘못입력해도 빈쿼리를 반환하기 때문에 keyerror가 발생하지 않습니다.
# 그리고 get의 두번째 인수에 default를 선언할 수 있습니다.
username = data.get('username')
email = data.get('email')
password = data.get('password')
contact = data.get('contact', "")
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
if validate_email(email) == False:
return JsonResponse({'message':'INVALID EMAIL'}, status=400)
if validate_password(password) == False:
return JsonResponse({'message':'INVALID PASSWORD'}, status=400)
if User.objects.filter(email = email).exists():
return JsonResponse({'message':'EXISTING USER'}, status=400)
User.objects.create(
username = username,
email = email,
password = hashed_password, # 암호화된 비밀번호로 DB에 저장
contact = contact,
)
return JsonResponse({'message':'SUCCESS'}, status=201)
except KeyError:
return JsonResponse({'message' : 'KEY_ERROR'},status=400)
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
hashpw
: 비밀번호와 salt를 인자로 받아 암호화된 비밀번호를 생성한다.password.encode('utf-8')
: 패스워드 문자를 bytes로 인코딩합니다.
-> bcrypt 인자는 bytes로 입력을 받는다.bcrypt.gensalt()
: salt 값을 생성한다.
->salt
: 해시 함수에서 암호화된 비밀번호를 생성할 때 추가되는 bytes 단위의 임의의 문자열입니다..decode('utf-8')
: hashed_password를 DB에 저장하기 위해 bytes 형식을 문자 형식으로 디코딩합니다.