user app 생성
from django.db import models
class User(models.Model):
name = models.CharField(max_length=20)
email = models.EmailField(max_length=100)
password = models.CharField(max_length=20)
phone = models.CharField(max_length=20)
class Meta:
db_table = 'users'
from django.urls import path, include
urlpatterns = [
path('user', include('user.urls'))
]
user/urls.py 파일 생성 후 작성하기
from django.urls import path
from user.views import SignUpView
urlpatterns = [
path('', SignUpView.as_view())
]
import json
from django.http import JsonResponse, HttpResponse
from django.views import View
from user.models import User
class SignUpView(View):
def post(self, request):
MINIMUM_PASSWORD_LENGTH = 8 # 상수 선언
try:
data = json.loads(request.body)
name = data['name']
email = data['email']
password = data['password']
phone = data['phone']
if name and email and password and phone:
if User.objects.filter(name=name).exists():
return JsonResponse({'message': 'ID_ALREADY_EXISTS'}, status=400)
if User.objects.filter(email=email).exists():
return JsonResponse({'message': 'EMAIL_ALREADY_EXISTS'}, status=400)
if User.objects.filter(phone=phone).exists():
return JsonResponse({'message': 'PHONE_NUMBER_ALREADY_EXISTS'}, status=400)
if '@' not in email or '.' not in email:
return JsonResponse({'message': 'INVALID_EMAIL'}, status=400)
if len(password) < MINIMUM_PASSWORD_LENGTH:
return JsonResponse({'message': 'PASSWORD_VALIDATION_ERROR'}, status=400)
User.objects.create(name=name, email=email, password=password, phone=phone)
return JsonResponse({'message': 'SUCCESS'}, status=200)
except KeyError:
return JsonResponse({'message': 'KEY_ERROR'}, status=400)
password가 8자리 이상이어야 한다는 조건을
if len(password) < 8:
이런 식으로 숫자를 직접 써줬었는데
이런 건 가급적 상수로 선언하여 사용하라고 하셔서
회원가입 클래스 선언부 아래에 MINIMUM_PASSWORD_LENGTH 라는 상수를 추가해주었는데 NameError(NameError: name 'MINIMUM_PASSWORD_LENGTH' is not defined)가 나서 post 함수를 선언하고 바로 다음으로 옮겨주었더니 잘 되었다.
class SignUpView(View):
def post(self, request):
MINIMUM_PASSWORD_LENGTH = 8 # 상수 선언
try:
data = json.loads(request.body)
name = data['name']
email = data['email']
password = data['password']
phone = data['phone']
※ 상수의 선언은 파일 상단 import 아래 부분이나, 특정 클래스 내부에서 사용될 경우 클래스 선언부 아래, 보안에 연관될 경우 외부 설정 파일(my_settings.py)에 선언 후 import 하여 사용하는 등 다양한 방법이 있다.
JsonResponse를 작성할 때 message를 소문자로 썼었는데
return JsonResponse({'message': 'ID already exists'}, status=400)
메시지 또한 문자로 된 응답 코드로 취급해야 한다고 하셔서 '대문자'와 _
를 이용하여 입력하였다.
return JsonResponse({'message': 'ID_ALREADY_EXISTS'}, status=400)
※ 메시지로 응답하는 경우에는 보다 분별력 있는 상황 전달을 위해서 사용하게 된다. 이를 위한 메시지는 단순히 안내 메시지를 전달하기보다는 이 메시지 또한 문자로 된 응답 코드로 취급해야 한다.
처음에는 위에 표시한 변수들을 try문 바깥 쪽에 두었는데 (try문 선언하기 바로 전에 넣었었다) 그렇게 하면 except KeyError 400으로 해놓은 게 안 되더라.. 변수들을 try문 안에 넣으니까 해결이 되었다. try문 밖에 있으면 except KeyError: 구문에 오기 전에 에러가 나서 그렇다고 한다.
에비츄 화이텡~~~💓