Django - 회원가입 view

신지원·2021년 4월 8일
0
post-thumbnail

회원가입

<회원가입 flow>
1. 클라이언트가 자신의 정보를 body에 담아서 request를 보낸다.
2. 이메일 형식이 맞는지 확인한다.
3. 이메일이 이미 존재 하는지 그 여부를 확인한다.
4. 비밀번호가 지정한 길이보다 더 긴지 확인한다.
5. 비밀번호를 암호화한다.
6. 필수로 들어가야 할 요소들이 들어가지 않은 경우 KEY ERROR를 발생시킨다.

import json

from django.http  import JsonResponse

from django.views import View
from user.models  import User

class SignupView(View):
    def post(self, request):
        PASSWORD_LENGTH = 8
        try:
            data = json.loads(request.body)

            if '@' not in data['email'] or '.' not in data['email']:
                return JsonResponse({'MESSGAGE': 'INVALID EMAIL'}, status=400)

            if User.objects.filter(email=data['email']).exists():
                return JsonResponse({'MESSGAGE': 'DUPLICATED EMAIL'}, status=400)

            if User.objects.filter(nickname=data['nickname']).exists():
                return JsonResponse({'MESSGAGE': 'ALREADY USED'}, status=400)

            if len(data['password']) <= PASSWORD_LENGTH:
                return JsonResponse({'MESSGAGE': 'INVALID PASSWORD'}, status=400)

            hashed_password = bcrypt.hashpw(data['password'].encode('utf-8'), bcrypt.gensalt())
            decode_hash_pw = hashed_password.decode('utf-8')

            User.objects.create(
                email        = data['email'],
                nickname     = data.get('nickname','default'),
                name         = data['name'],
                phone_number = data['phone_number'],
                password     = decode_hash_pw
            )

            return JsonResponse({'MESSAGE': 'SUCCESS'}, status=201)

        except KeyError:
            return JsonResponse({'MESSAGE': 'KEYERROR'}, status=400)

Review

  • 상수명은 PASSWORD_LENGTH은 대문자로 적어주는 것이 좋다.
    비밀번호 길이를 확인할때 상수를 안쓰고 바로 숫자를 쓰면 나중에 유지보수 할때 좋지 않다.

  • .filter(칼럼명='찾고싶은 거') (2개이상 찾을 수 있다.)

  • 딕셔너리.get(key, value)
    key: 찾고자 하는 것
    value(optional): key가 없을 경우 value가 리턴된다. default value는 None이다.

  • 가독성을 위해서 불필요한 elif와 if를 과도하게 중첨해서 사용하지 않는게 좋다.

  • 에러메시지는 프론트가 보는 것이기 때문에 불필요하게 친절하고 길게 할 필요가 없고, 메시지 형식은 통일 시키는 것이 좋다.

  • except를 맨 밑에 두는게 가독성에 좋다.

  • and와 or은 조건과 조건을 비교하는 것

if '@' not in data['email'] or '.' not in data['email']:

if 'a' or ',' not in data['email']:

처음에는 아래줄처럼 넣었었는데, 저 구문을 풀어서 설명해보면
'@' 또는 '.'이 이메일 데이터에 없다면 이 되고,
윗줄을 풀어서 설명하면
@가 이메일 데이터에 없고, .이 이메일 데이터에 없다면이 된다.
즉, @,. 각각이 이메일에 있는지 없는지를 확인해야 하는것..!

  • 에러코드 404: 원하는 데이터 자원이 존재 하지 않는다.

0개의 댓글