Project Week 2 - threppa 회원가입 view

김우식·2022년 6월 24일
0

회원가입 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를 반환하는 예외처리를 작성해두었다.

profile
반가워요!

0개의 댓글