'westagram' 프로젝트를 진행하면서, 필수적으로 구현해야하는 기능에 대해서 내가 잘못 작성했던 것
들과 개선해야 할 점들을 수정 전
과 수정 후
를 비교하면서 기록해보려고 한다.
이번에는 views.py에서 회원가입 기능 구현
에 대해서 작성해 볼 것이다!
현재까지(or 최종) : views.py에 작성한 회원가입 작성한 내용 👇
*처음에 작성한 코드👇
[개선 할 점, 깨달은점]
json
과 re
를 import를 해올때,
각각 한줄 한줄 import해오는 걸로 코드를 작성하는 것보다
,(컴마)
를 이용하여 한 줄에 같이 작성하는게 훨씬 간결하게 코드를 작성 할 수 있다.
가장 상단으로 올리는 이유...는 좀더 검색해 보는 걸로!
[개선점 반영 후 👇]
import json, re
from django.http import JsonResponse
from django.views import View
from .models import User
*처음에 작성한 코드👇
[개선 할 점, 깨달은점]
if 조건문 :
return
if 조건문을 작성 할때,
조건문
이 True 값이 나오면, return을 반환해준다!
반대로 조건문에 부합하면, 해당 조건문을 탈출?할 것이다.
인데,
이미 조건문 자체적으로 True, False 인지 판단 할 수 있기 때문에
조건문 값 그대로 사용한다.
굳이, == None
, == False
, == 0
라고 표현하지 않아도 된다.
== None
으로 작성하는 방식 보다는,
는 것을 배웠다.
[개선점 반영 후 👇]
if not re.match('^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$', user_email):
return JsonResponse({"message": "EMAIL_ERROR"}, status=400)
if not re.match('^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]).{8,}$', user_password):
return JsonResponse({"message": "PASSWORD_ERROR"}, status=400)
이미 저장 되어 있다! ==> 메소드 .filter()
을 이용하기.
*filter() 메소드 : 조건에 부합하는 QuerySet으로 여러개의 객체를 리스트에 담아서 불러온다.
*exists() : QuerySet에 있는 객체가 존재하는지 확인 여부를 알려준다.
(불필요한 QuerySet 캐시를 만들지 않기 때문에, 비효율 방지 가능)
if User.objects.filter(email=user_email).exists():
return JsonResponse({"message" : "이미 존재하는 이메일입니다. 이메일을 다시 입력해주세요."}, status=400)
여기서, 왜!!
filter( )
만 작성하고 조건문이 끝이 아니고,
filter( ).eixists()
까지 작성하는게 효율적인가?
에 대해 궁금증이 발생했다.
만약, 중복된 이메일을 출력하는 것이였다면! filter( )까지 작성해도 되었을 것이지만,
하지만, 내가 구현해야 하는 것은 '중복 여부 확인'이기 때문에 filter의 하부 메소드인 filter( ).eixists( )
까지 작성해 주는 것이 좀더 효율적(시간절약)이다...
if ~ filter( ):
라고만 작성하는 것보다,
if ~ filter( ).exists():
를 작성하였을때, 존재 여부만 확인하여 시간절약을 할 수 있다.
우선,
정규식 표현이란 ?
정규식 표현을 사용하는 이유는 ?
*처음에 작성한 코드 👇>
import re
users_email = re.complie('^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$')
users_password = re.complie('^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]).{8,}$')
class UserView(View):
def post(self, requst):
data = json.loads(requst.body)
user_email = data['email']
user_password = data['password']
try:
if re.match(user_email, user_email) is None:
ruturn JsonResponse({"message" : "KEY_ERROR"}, status=400)
if re.match(user_password, user_password) is None:
ruturn JsonResponse({"message" : "KEY_ERROR"}, status=400)
수정 전에 작성한 코드는
해당 정규식을 여러번 사용할 경우에,
가독성을 위해 변수를 선언하여 코드를 작성하는게 좋으나,s
현재 작성하는 것처럼 한번씩만 사용할 경우엔, re.match만으로 작성하는게 좋다.
if not re.match('^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$', user_email):
return JsonResponse({"message": "EMAIL_ERROR"}, status=400)
if not re.match('^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]).{8,}$', user_password):
return JsonResponse({"message": "PASSWORD_ERROR"}, status=400)
*처음에 작성한 코드 👇
[massege 내용을 길게 한글로 작성한 이유]
--> 내가 views.py에서 오류 메세지나 올바른 메세지를 작성할때,
한글로 작성하면 타인이 쉽게 알아 볼 수 있도록 한글로 자세하고 길게 작성하였다.
여기서 잠깐!!
내가 놓치고 넘어간 개념 부분이 발생했던 것이다.🤦♀️🤦
우리가 return할 때도, JsonResponse를 반환해서 작성하는 이유가 무엇이냐는 것이다!
바로,
프론트엔드 개발자와 Json 형태로 소통
하기 위함이라는 것을 잊어버리고 있었던 것이다....//저런 😶🌫️😶🌫️😶🌫️
즉, Json형태로 메세지를 작성할 땐,
프론트엔드 개발자가 알아볼수 있게 간단명료
하지만
어떤 메세지를 담고 있는지를 정확하게 작성
하는게 좋다는 것을 배웠다.
if User.objects.filter(email=user_email).exists():
return JsonResponse({"message" : "email_alreay_exists"}, status=400)