[Django] Westagram - Mission 2. 회원가입 엔드포인트

Jeongyun Heo·2021년 2월 3일
0

Westagram

목록 보기
1/3
post-thumbnail

Mission2. 회원가입 엔드포인트

user app 생성

user/models.py

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'

westagram/urls.py

from django.urls import path, include

urlpatterns = [
    path('user', include('user.urls'))
]

user/urls.py

user/urls.py 파일 생성 후 작성하기

from django.urls    import path

from user.views import SignUpView

urlpatterns = [
    path('', SignUpView.as_view())
]

user/views.py

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)

멘토님 리뷰

1. 상수 선언하여 사용하기

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 하여 사용하는 등 다양한 방법이 있다.

2. 메시지 조차도 코드다

JsonResponse를 작성할 때 message를 소문자로 썼었는데

return JsonResponse({'message': 'ID already exists'}, status=400)

메시지 또한 문자로 된 응답 코드로 취급해야 한다고 하셔서 '대문자'와 _를 이용하여 입력하였다.

return JsonResponse({'message': 'ID_ALREADY_EXISTS'}, status=400)

※ 메시지로 응답하는 경우에는 보다 분별력 있는 상황 전달을 위해서 사용하게 된다. 이를 위한 메시지는 단순히 안내 메시지를 전달하기보다는 이 메시지 또한 문자로 된 응답 코드로 취급해야 한다.

try문 안에 넣기

처음에는 위에 표시한 변수들을 try문 바깥 쪽에 두었는데 (try문 선언하기 바로 전에 넣었었다) 그렇게 하면 except KeyError 400으로 해놓은 게 안 되더라.. 변수들을 try문 안에 넣으니까 해결이 되었다. try문 밖에 있으면 except KeyError: 구문에 오기 전에 에러가 나서 그렇다고 한다.

2개의 댓글

comment-user-thumbnail
2021년 2월 6일

에비츄 화이텡~~~💓

1개의 답글