프로젝트 시작을 위해 초기세팅을 하는 mission 1(kick-off)을 끝내고 위스타그램의 기능 중 하나인 회원가입 엔드포인트를 mission 2를 구현하고자 한다.
- 생성한 사용자 클래스를 불러옵니다. 한 번에 모든 클래스를 import 해서는 안됩니다. 내가 사용할 클래스를 정확히 지칭해주세요
- 인스타그램에 회원가입 할 때에는 사용자 계정(예:전화번호, 사용자 이름 또는 이메일 중 하나)을 필수로 필요합니다.
- 인스타그램에 회원가입 할 때에는 비밀번호도 필수로 필요합니다.
- 이메일이나 패스워드 키가 전달되지 않았을 시, {"message": "KEY_ERROR"}, status code 400 을 반환합니다.
- 회원가입시 이메일을 사용할 경우, 이메일에는 @와 .이 필수로 포함되어야 합니다. 해당 조건이 만족되지 않을 시 적절한 에러를 반환해주세요. 이 과정을 email validation이라고 합니다.
- 회원가입시 비밀번호는 8자리 이상이어야만 합니다. 해당 조건이 만족되지 않을 시, 적절한 에러를 반환해주세요. 이 과정을 password validation이라고 합니다.
- 회원가입시 서로 다른 사람이 같은 전화번호나 사용자 이름, 이메일을 사용하지 않으므로 기존에 존재하는 자료와 중복되어서는 안됩니다. 적절한 에러를 반환해주세요.
- 회원가입이 성공하면 {"message": "SUCCESS"}, status code 200을 반환합니다.
- [추가 구현 사항] email validation 또는 password validation 과정에서 정규식을 사용해보세요
django-admin startapp user # user app 생성
git branch feature/signup # 회원가입 기능에 맞는 git branch 생성
git checkout freature/signup # 해당 branch로 이동
경로: user/models.py
from django.db import models
class Users(models.Model): # 회원가입 시 필요한 정보받는 데이터 테이블 생성
email = models.CharField(max_length=200)
password = models.CharField(max_length=500)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
db_table = 'Users'
def __str__(self):
return self.name
경로: users/views.py
views.py를 작성하면서 헷갈렸던 부분은 try-except과 if의 쓰임의 차이였다.
if 구문은 조건이
True
인지False
인지만 판단을 하고 return을 하는 반면
try - except 구문은 파이썬 자체에서 조건을 판단하여 error raise
emaill, password validation을 제외한 나머지는 금방 구현했는데 마지막에 validation하면서 한참을 헤맸다 ㅠㅠ
처음엔 models.py에 함수 선언을 했는데 함수를 읽지 못하는 문제가 발생해서 views.py 내에서 구현해보라는 조언을 받아 정규식을 이용해 views.py에 구현했다.
import json
import re
from django.views import View
from django.http import JsonResponse
from .models import Users
class SignupView(View):
def post(self, request):
data = json.loads(request.body)
email_validation = '^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-
pw_validation = '^[A-Za-z0-9@#$%^&+=]{8,}$'
try:
if not re.match(email_validation, data['email']):
return JsonResponse({"message":"INVALID_ID"}, status = 401)
if not re.match(pw_validation, data['password']):
return JsonResponse({"message":"INVALID_PW"}, status = 400)
if Users.objects.filter(email=data['email']).exists():
return JsonResponse({"message":"USER_EXIST"}, status = 400)
else:
Users.objects.create(
email = data['email'],
password = data['password']
)
return JsonResponse({'message': 'SUCCESS'}, status = 200)
except KeyError:
return JsonResponse({"message":"KEY_ERROR"}, status = 400)
http와 통신을 하면 주어진 값에 따라 아래와 같이 결과가 반환되는 것을 알 수 있다.
http -v localhost:8000/user/signup email:"anasdfasdf@abc.com" password="asdff1234"