자 이번엔 ver.3입니다.
주말기간이라 멘토님들의 피드백없이 혼자의 생각으로 수정한것이라 도찐개찐느낌일 수 있습니다.
지난번에는 수많은 except 클래스구현과 예외처리가 불필요하다 생각 되었습니다.
우선 ver.3 에는 따로 모듈을 만들어서 진행하지 않았습니다.
DB역시 이전과 동일합니다.
views.py 코드
class SingUpView(View):
def post(self, request):
try:
data = json.loads(request.body)
username = data['username']
first_name = data['first_name']
last_name = data['last_name']
email = data['email']
password = data['password']
phone_number = data['phone_number']
RegexTool.not_found(data)
RegexTool.username_validate(username)
RegexTool.email_validate(email)
RegexTool.phone_number_validate(phone_number)
RegexTool.password_validate(password)
User.objects.create(
username = username ,
first_name = first_name ,
last_name = last_name ,
email = email ,
password = password ,
phone_number = phone_number
)
return JsonResponse({'message' : 'SUCCESS'} , status = 201)
except KeyError:
return JsonResponse({'message' : 'KeyError'} , status = 400)
except:
return RegexTool.JsonResponse(result, status = 400)
조금 짧아졌고 못보던 RegexTool이 등장했습니다.
RegexTool클래스는 views.py안에 아래와 같이 존재합니다.
class RegexTool():
EMAIL_REGEX = '^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
PHONE_NUMBER_REGEX = '\d{3}-\d{3,4}-\d{4}'
PASSWORD_REGEX = '^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$'
result = {'message': None}
def not_found(data):
for key,value in data.items():
if bool(value) == False:
result['message'] = f'{key}NotFound'
raise
def username_validate(username):
if User.objects.filter(username = username).exists():
result['message'] = 'UsernameDuplicate'
raise
def email_validate(email):
if User.objects.filter(email = email).exists():
result['message'] = 'EmailDuplicate'
raise
elif not re.match( EMAIL_REGEX, email):
result['message'] = 'InvalidEmail'
raise
def password_validate(password):
if not re.match( PASSWORD_REGEX, password):
result['message'] = 'InvalidPassword'
raise
def phone_number_validate(phone_number):
if User.objects.filter(phone_number = phone_number).exists():
result['message'] = 'PhoneNumberDuplicate'
raise
elif not re.match( PHONE_NUMBER_REGEX ,phone_number):
result['message'] = 'InvalidPhoneNumber'
raise
***모든 함수는 스태틱메서드로 설정하였습니다.
이번엔 함수 실행순으로 보겠습니다.
1.Regex.not_found
딕셔너리형태로 들어온 data를 받아서 각 값이 빈문자열인지 판단하는 함수입니다.
Django의 경우 blank=True입니다. 빈문자열을 받도록 허용하겠다는 말 입니다.
하지만 username 즉 인스타 id가 빈문자열로 들어오는것은 말이 안된다고 생각하여 이 과정을 거치게 되었습니다.
def not_found(data):
for key,value in data.items():
if bool(value) == False:
result['message'] = f'{key}NotFound'
raise
1. if 문에서 빈문자열인지 아닌지 판별합니다.
이제와서 안 사실이지만 value != True하면 더 간략하게 설정됩니다.
2. result['message']에 error메세지에 들어갈말을 반환합니다.
f'{}'를 사용하여 현재 데이터의 키값을 찾을수 없다고 유동적으로 표현했습니다.
3.rasie로 예외를 발생시킵니다.
2.Regex.username_validate
이번에는 username의 중복을 확인하는 함수입니다.
ver.2와 같은 방식입니다.
def username_validate(username):
if User.objects.filter(username = username).exists():
result['message'] = 'UsernameDuplicate'
raise
짧게 설명하자면 filter().exists()의 리턴이 True가 나온다면(이미 db에 해당 데이터가 있다면)
resulte['message']에 에러메세지를 넣고 예외를 발생시키는 것 입니다.
3.Regex.email_validate
우선 2번과 같은 방식으로 중복검사를 해줍니다.
def email_validate(email):
if User.objects.filter(email = email).exists():
result['message'] = 'EmailDuplicate'
raise
elif not re.match( EMAIL_REGEX, email):
result['message'] = 'InvalidEmail'
raise
re모듈의 match 함수를 사용하여서 미리 규정해놓은 정규표현식으로 유효성 검사를 진행 합니다.
이이후로는 모두 동일한방법으로 중복검사, 유효성검사를 통과가 안될시에는 result에 에러메세지를 입력 후 예외를 발생시킵니다.
4.예외 처리
return JsonResponse({'message' : 'SUCCESS'} , status = 201)
except KeyError:
return JsonResponse({'message' : 'KeyError'} , status = 400)
except:
return RegexTool.JsonResponse(result, status = 400)
결국 앞에 모든 함수에서 예외를 발생시키기전 result에 에러메세지를 넣어놓아서
모든 예외는 각기 다른 에러메세지를 보유하게 되었습니다.
.ver의도 & 느낀소감
사실 제일처음 생각했던게 views.py 내의 클래스 생성이였습니다.
하지만 views.py를 안에 실제 api소통을 제외한것들을 최대한 제거 하고싶어서 모듈로 빼서 처리했습니다.
근데 돌고돌아 결국 다른 파일의 무언가를 끌어다 쓰는과정에서 조금씩 삐걱거리는부분이 점차점차 생기면서
같은 .py파일 내에서 처리할려고 클래스로 구현하게 되었습니다.
이렇게 구현을 하고 나니 결국 1번의 예외를 위해 2줄의 코드를 작성하는것에 대한 회의감이 들었고
다른 한편으로는 이런식의 예외처리는 결국 제가 예상치못한 예외를 처리시키지 못한다는것을 깨달았습니다.
뭘하든 결과에 나사가 하나빠진느낌이지만 이대로 제출했습니다.
'Python > Django' 카테고리의 다른 글
[Django] Models class Manager (0) | 2022.06.26 |
---|---|
[Django] ver.3 피드백 모음 (0) | 2022.06.19 |
[Django] Westagram 회원가입 기능 작성해보기 ver.2 (0) | 2022.06.13 |
[Django] Westagram 회원가입 기능 작성해보기 ver.1 (0) | 2022.06.12 |
[Django] QuerySet 기본적인 속성과 Field lookups (0) | 2022.06.09 |