지난 시간에 이어서 만든 모델링을 가지고 회원가입을 구현해보도록 하겠습니다.
일단 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을 이용해서 많은 연습을 하는게 필요하다고 느꼈습니다.
다시 한 번 복기해보면서 쿼리셋에 대한 정리도 한 번 해보도록 하겠습니다.
다음시간에는 로그인을 한 번 구현해보도록 하겠습니다.
잘못된 부분이나 코드는 댓글 부탁드립니다. 감사합니다