[westargram]3. 회원가입 구현

97woo·2022년 2월 22일
0

westargram

목록 보기
3/3

지난 시간에 이어서 만든 모델링을 가지고 회원가입을 구현해보도록 하겠습니다.

1. 회원가입 View 작성

일단 orm을 이용하기 위해서 class를 잘 작성하는게 중요한데요
만들어둔 모델링을 참고하여 작성해보도록하죠

지난시간에 작성한 모델링 입니다.

클래스를 작성하기전에 당연히 회원가입을 하려면 name과email password phone_number 까지 회원가입을 할때 입력 받으면 되겠네요
그럼 당연히 회원가입을 하기위한 요청이 올테니 post를 사용해서
만들면 될 것 같은데요

이떄 회원가입을 해본 경험이 있으시다면 이메일이나 비밀번호에 조건이 걸린 경우를 볼 수있는데요 이 걸 정규표현식을 사용해서 사용하도록 하겠습니다.

일단 가장 어려운 정규표현식부터 적어볼게요

 REGEX_EMAIL    = ('^[a-zA-Z0-9_-]+@[a-z]+\.[a-z]+')
 REGEX_PASSWORD = ('^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{8,}$') 
저희는 이메일과 패스워드에만 정규표현식을 사용하도록 하겠습니다.

REGEX_EMAIL을 간단히해석해보자면 '시작을'  0~9 사이 숫자 or a-z A-Z 알바펫 아무거나로 시작하고  /  중간에 - _  같은 문자가 있을수도 있고 없을수도 있으며 / @ 가 반드시 존재하고/그뒤는 소문자만 존재하고 / 반드시 .(Dot)와야하며/그뒤에도 소문자가 와야합니다.

REGEX_PASSWORD를 간단히 해석하자면 소문자와대문자가 들어가며 숫자와 특수문자가 반드시 하나 이상은 들어가야합니다.

정규표현식을 정리하였으니 다른 부분도 코드를 보면서 설명하도록 하겠습니다.

import json #json 사용하기위해 추가
import re   #정규표현식 사용하기위해 추가

from django.http  import JsonResponse
from django.views import View

from users.models import User

class UserView(View):
    def post(self, request):
        try:
            data           = json.loads(request.body)
            REGEX_EMAIL    = ('^[a-zA-Z0-9_-]+@[a-z]+\.[a-z]+')
            REGEX_PASSWORD = ('^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{8,}$') 
        
            if not re.match(REGEX_EMAIL,data['email']):
                return JsonResponse({"message":"invalid_email"},status=400)
            
            if not re.match(REGEX_PASSWORD,data['password']):
                return JsonResponse({"message":"invalid_password"},status=400)       
            
            if User.objects.filter(email = data["email"]).exists():
                return JsonResponse({"message":"duplicate_email"}, status=400)
            
            if User.objects.filter(phone_number =data["phone_number"]):
                return JsonResponse({"message":"duplicate_phone_number"}, status=400)
            
            User.objects.create(
                name         = data['name'],
                email        = data['email'],
                password     = data['password'],
                phone_number = data['phone_number'],
            )
            return JsonResponse({"message":"success"},status=201)
        except KeyError:
            return JsonResponse({"message":"KEY_ERROR"},status=400)

http 통신을 위해서 json을 사용해 서버와 통신을 해야하구요


if not re.match(REGEX_EMAIL,data['email']):
  return JsonResponse({"message":"invalid_email"},status=400)
            
if not re.match(REGEX_PASSWORD,data['password']):
   return JsonResponse({"message":"invalid_password"},status=400)       

if User.objects.filter(email = data["email"]).exists():
  return JsonResponse({"message":"duplicate_email"}, status=400)

if User.objects.filter(phone_number=data["phone_number"]):
  return JsonResponse({"message":"duplicate_phone_number"}, status=400)

이 부분을 먼저 보자면 첫 if문부터 보자면 post들어온 email이 정규표현식이 매치 되지않으면 JsonResponse 사용해 에러코드 400을 반환하게 되어있습니다.
두번째 if문 은 마찬가지로 패스워드가 정규표현식에 맞지 않으면 에러코드 400를 반환하게 되어있구요
3번째 if문은 만약 데이터베이스에 이미 email이 존재한다면 당연히 회원가입을 하지 못하겠죠? 중복된이메일이라며 에러코드를 반환합니다.
4번째 if문 역시 모델에서 unique값을 Phone_number에 주었기 때문에
중복된 번호가 회원가입시 들어온다면 중복된 폰번호입니다를 알리며 에러코드를 반환합니다.

httpie를 사용하여 회원가입을 진행해보았는데요 정상적인 success를 알리며 회원가입이 되었습니다.
과연데이터베이스에 잘들어갔을까요??? 확인해 볼까요??

네 데이터베이스에 잘추가되었습니다.

오늘은 정규표현식을 사용해서 models에 그려논 설계도를 바탕으로 회원가입 view를 작성해 회원가입을 해보았습니다. 사실 처음이라 굉장히 많은 시간이 들었는데요 python shell을 이용해서 많은 연습을 하는게 필요하다고 느꼈습니다.

다시 한 번 복기해보면서 쿼리셋에 대한 정리도 한 번 해보도록 하겠습니다.
다음시간에는 로그인을 한 번 구현해보도록 하겠습니다.

잘못된 부분이나 코드는 댓글 부탁드립니다. 감사합니다

profile
한 발씩 나아가는중

0개의 댓글