Mini Project | westagram 회원가입 엔드포인트 구현

Hyeonju L.·2020년 12월 12일
1

Project

목록 보기
2/8
post-thumbnail

[Mission 2] westagram 회원가입 엔드포인트 구현하기

프로젝트 시작을 위해 초기세팅을 하는 mission 1(kick-off)을 끝내고 위스타그램의 기능 중 하나인 회원가입 엔드포인트를 mission 2를 구현하고자 한다.

Mission

  • 생성한 사용자 클래스를 불러옵니다. 한 번에 모든 클래스를 import 해서는 안됩니다. 내가 사용할 클래스를 정확히 지칭해주세요
  • 인스타그램에 회원가입 할 때에는 사용자 계정(예:전화번호, 사용자 이름 또는 이메일 중 하나)을 필수로 필요합니다.
  • 인스타그램에 회원가입 할 때에는 비밀번호도 필수로 필요합니다.
  • 이메일이나 패스워드 키가 전달되지 않았을 시, {"message": "KEY_ERROR"}, status code 400 을 반환합니다.
  • 회원가입시 이메일을 사용할 경우, 이메일에는 @와 .이 필수로 포함되어야 합니다. 해당 조건이 만족되지 않을 시 적절한 에러를 반환해주세요. 이 과정을 email validation이라고 합니다.
  • 회원가입시 비밀번호는 8자리 이상이어야만 합니다. 해당 조건이 만족되지 않을 시, 적절한 에러를 반환해주세요. 이 과정을 password validation이라고 합니다.
  • 회원가입시 서로 다른 사람이 같은 전화번호나 사용자 이름, 이메일을 사용하지 않으므로 기존에 존재하는 자료와 중복되어서는 안됩니다. 적절한 에러를 반환해주세요.
  • 회원가입이 성공하면 {"message": "SUCCESS"}, status code 200을 반환합니다.
  • [추가 구현 사항] email validation 또는 password validation 과정에서 정규식을 사용해보세요

1. app 및 git branch 생성

django-admin startapp user		# user app 생성

git branch feature/signup		# 회원가입 기능에 맞는 git branch 생성

git checkout freature/signup		# 해당 branch로 이동

2. models.py 작성

경로: 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

3. views.py 작성

경로: 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)

4. 결과

http와 통신을 하면 주어진 값에 따라 아래와 같이 결과가 반환되는 것을 알 수 있다.

http -v localhost:8000/user/signup email:"anasdfasdf@abc.com" password="asdff1234"

profile
What you think, you become. What you feel, you attract. What you imagine, you create.

0개의 댓글