# users/validation.py
import re
# @와 .을 필수로 포함해야 합니다.
def validate_email(email):
email_regex = '^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
if not re.match(email_regex, email):
return False
# 최소 8 글자 이상, 최소 한 개의 영문과 숫자 그리고 특수 문자를 포함해야 합니다.
def validate_password(password):
password_regex = '^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$'
if not re.match(password_regex, password):
return False
# users/views.py
import json
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:
username = data['username']
email = data['email']
password = data['password']
contact = data['contact']
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 = password,
contact = contact,
)
return JsonResponse({'message':'SUCCESS'}, status=201)
except KeyError:
return JsonResponse({'message' : 'KEY_ERROR'},status=400)
if User.objects.filter(email = email).exists():
- if문안에서 exists()를 사용하지 않아도 filter()는 조건에 맞는 레코드들을 반환하므로 True가 반환되지만 이는 속도도 느려지고 캐시도 낭비하는 방법이므로 exists()를 사용하여 해당 레코드가 존재하는지만 확인하는 방법이 더 효율적입니다.
# urls.py
from django.urls import path, include
urlpatterns = [
path('users', include('users.urls'))
]
# users.urls.py
from django.urls import path
from users.views import SignUpView
urlpatterns = [
path('/signup', SignUpView.as_view())
]