Westagram project를 진행하며 github으로 협업하기 위한 초기 개발환경 세팅을 완료한 후 Modeling을 통해 Database에 Tabel을 생성하고 회원가입 기능을 SignUpView로 구현했다. 작업과정을 돌아보며 새롭게 배운 것들과 유용한 Review들을 기록해봤다.
사용자(User)를 관리할 Class를 생성하고, 생성한 Table을 통해 회원가입 기능과 로그인 기능등을 작성하게 된다. 다음과 같은 사용자의 정보를 포함하는 User Class를 작성하자.
Class는 다음과 같이 작성했다.
from django.db import models
# Create your models here.
class User(models.Model):
name = models.CharField(max_length=45)
email = models.CharField(max_length=200, unique=True)
password = models.CharField(max_length=200)
phone_number = models.CharField(max_length=45)
age = models.PositiveIntegerField()
class Meta:
db_table = 'users'
def __str__(self):
return self.name
모든 동기들이 Model에 대해 연우님께 리뷰를 받았는데, 기억하면 좋을 리뷰 내용들을 모아봤다.
import models
에서 대부분의 field
와 method
들을 제공받기에 따로 field
를 import하지 않아도 된다.TextField
는 게시판의 게시글처럼 받아야 할 데이터가 큰 경우 사용된다. 따라서 유저 정보는 단순 문자열로 CharField
로 작성하는 것이 좋다.IntegerField
의 경우 숫자가 0으로 시작하면 누락하고 저장하기 때문에(011->11) 01038902027
같은 휴대폰번호 양식은 보통 CharField
문자열로 관리한다.max_length
는 여유있게 지정해준다.다른 동기분이 휴대폰 번호에 PhoneNumberField
를 사용하셨는데, 따로 패키지를 받아 import해야 해서 현재 프로젝트에서는 굳이 사용하지 않았다. 알아두면 나중에 유용할 것 같다.
모델링을 완료하고 회원가입 기능 View를 구현했다. 회원가입을 위한 View 기능은 다음과 같다.
조건들을 만족하며 작성한 View는 다음과 같다.
import json, re
from django.http import JsonResponse
from django.views import View
from users.models import User
class SignUpView(View):
def post(self, request):
try:
data = json.loads(request.body)
email_validation = re.compile("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$")
password_validation = re.compile("^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$")
if data['email']=="" or data['password']=="":
return JsonResponse({"Message":"NO_INPUT_DATA"}, status=400)
if (email_validation.match(data['email']) is None) or (password_validation.match(data['password']) is None):
return JsonResponse({"MESSAGE":"INVALID_FORMAT"}, status=400)
if User.objects.filter(email = data['email']).exists():
return JsonResponse({"MESSAGE":"EMAIL_ALREADY_EXIST"}, status=400)
User.objects.create(
name = data['name'],
email = data['email'],
password = data['password'],
phone_number = data['phone_number'],
age = data['age']
)
return JsonResponse({"MESSAGE":"SUCCESS"}, status=201)
except KeyError:
return JsonResponse({"MESSAGE":"KEY_ERROR"}, status=400)
이메일의 @,. 포함 여부나 비밀번호의 문자, 특수문자 복합 등 데이터의 값이 타당하고 유효한지 판단하는 것을 Validation이라 한다. 만약 Form, Template을 사용한다면 Model에서 Django Validator를 이용하는 것이 좋을 수 있지만, Westagram에서는 사용하지 않으므로 View에서 Email, Password Validation을 정규표현식을 이용해서 수행했다.
파이썬에서는 정규 표현식 모듈 re
를 지원하므로 이를 이용해 특정 규칙이 있는 텍스트 데이터를 빠르게 정제할 수 있다. re
모듈에서 지원한 함수중 다음 2가지를 사용했다.
re.compile
re.match
None
을 return한다.Email 정규표현식은 .
이후에는 2~6개의 영대소문자를 사용하여 co.kr
와 같은 이메일 주소에도 대응할 수 있도록 했다. Password는 8자리 이상 문자, 특수문자, 숫자의 복합이다. 알맞은 정규표현식을 토대로 먼저 re.compile
을 통해 파이썬이 인식할 수 있는 정규표현식 패턴을 만든다.
email_validation = re.compile("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$") password_validation = re.compile("^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$")
만든 패턴을 이용해 re.match
에 적용해 None
을 return하면 data가 validation을 통과하지 못했다는 의미이므로 Invalid Format
에러를 반환한다.
if (email_validation.match(data['email']) is None) or (password_validation.match(data['password']) is None):
return JsonResponse({"MESSAGE":"INVALID_FORMAT"}, status=400)
정규표현식의 문법이 많이 복잡하고 어렵지만 앞으로도 유용하게 사용할 수 있으니 조금씩 배워가야겠다.
Import
에도 순서가 존재한다. 파이썬 자체 모듈 -> 장고 모듈 -> 내가 만든 클래스 순서로 Import 해주자.None
인 경우 ==
operator 보다 is
operator를 사용한다.