이전 포스팅에서 회원가입 모델을 만들어봤으니, 이제 그 모델을 이용하여 회원가입 기능을 구현해보려한다.
먼저 정규 표현식을 사용하여 email과 password의 형식을 지정해준다.
# users/validation.py
import re
def email_validation(email):
EMAIL_REGEX = re.match(r"^([0-9a-zA-Z]?[+-_.]?[0-9a-zA-Z])+@[a-zA_Z-]+[.][a-zA_Z-]+$", email)
return EMAIL_REGEX
def password_validation(password):
PASSWORD_REGEX = re.match(r"^(?=.*[a-zA-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}", password)
return PASSWORD_REGEX
import reEMAIL_REGEXre.compile로 먼저 지정해주고, match를 사용하지 않은 이유는 굳이 중복되지 않는 상황에 가독성을 높이고 효율을 높이기 위해서 re.match를 사용하였다.@와 .을 필수로 포함하게 정규 표현식을 작성하였다.PASSWORD_REGEX# users/views.py
import json
from django.http import JsonResponse
from django.views import View
from .models import User
from .validation import email_validation, password_validation
class SignUpView(View):
def post(self, request):
try:
data = json.loads(request.body)
first_name = data["first_name"]
last_name = data["last_name"]
email = data["email"]
password = data["password"]
phone_number = data["phone_number"]
if not email_validation(email): #1
if not password_validation(password):
return JsonResponse( {"message" : "INVALID_EMAIL & PASSWORD"}, status = 403)
else:
return JsonResponse( {"message" : "INVALID_EMAIL"}, status = 403)
if not password_validation(password): #2
return JsonResponse( {"message" : "INVALID_PASSWORD"}, status = 403)
if User.objects.filter(email = email).exists(): #3
return JsonResponse( {"message" : "Email Already Exists"}, status = 400)
User.objects.create(
first_name = first_name,
last_name = last_name,
email = email,
password = password,
phone_number = phone_number
)
return JsonResponse( {"message" : "SUCCESS"}, status = 201) #4
except KeyError:
return JsonResponse( {"message" : "KEYERROR"}, status = 400)
#1email과 password의 형식이 맞지 않으면 INVALID_EMAIL & PASSWORD 메세지와 함께 에러를 반환한다.email은 형식에 맞지 않지만 password가 형식에 맞다면 INVALID_EMAIL 메세지와 함께 403 에러를 반환한다.#2password의 형식이 맞지 않으면 INVALID_PASSWORD 메세지와 함께 403에러를 반환한다.#3Email Already Exists 메세지와 함께 400 에러를 반환한다.#4SUCCESS 메세지와 함께 새로운 db 정보를 생성한다.# westagram/urls.py
from django.urls import path,include
# http://127.0.0.1:8000/users
urlpatterns = [
path('users', include('users.urls'))
]
# users/urls.py
from django.urls import path
from .views import SignUpView
# http://127.0.0.1:8000/users/signup
urlpatterns = [
path('/signup', SignUpView.as_view()), #1
]
#1GET, POST를 더 간단하게 사용할 수 있다.참고 사이트
as_view 참고