Westgram! 회고록!

sh_awtylol4·2022년 3월 26일
1

wecode 31기

목록 보기
19/24

model을 짜고 DB를 만들고 postman 사용 할 수 있게 되었다. 짧은 시간에 할 수 있는건 많아졌지만 정확하게 적재적소에 실수 없이 사용하는 것을 더 욱 연습해야 될 것 같다. 호준님 머지좀 해주세요ㅠㅠ

[Mission 1] Django 초기 세팅

  1. 가상환경 생성 및 활성화

    miniconda 사용법을 익히는게 포인트 인것 같다. (create, env list, activate, deactivate...)

  2. 프로젝트 초기 설정.

  • DB 생성, MySQL

    DB 만들때 많은 실수를 했다.(feat.호준 멘토님의 '거짓말') DB는 정보가 담기는 곳이기 때문에 설계부터 확실히 해야하며 DB안에 정보가 있는 상태에서 모델의 모양을 바꿀 수 있으나 잘못 만지게 되면 DB를 밀어버리는 경우가 허다하니 그런 일이 일어나지 않도록... 조심해야한다.DB 4번 밀어버림ㅋ

  • git,github,gitignore

    코딩을 시작하면서 모든 과정이 정확한 순서로 이뤄져야한다는 것을 git과 github를 하게 되면서 많이 느끼게 되었다. 급한 성격인 나도 앞으로는 순서를 한번 생각하는 버릇을 들여야 겠다.

  • django project

[Mission 2] 모델링

  • User Branch, App, Table 만들기
from django.db import models

class User(models.Model):
    name          = models.CharField(max_length=30)
    email         = models.EmailField(unique=True, max_length=245)
    password      = models.CharField(max_length=100)
    phone         = models.CharField(max_length=100)
    date_of_birth = models.DateField()
    created_at    = models.DateTimeField(auto_now_add=True)  
    updated_at     = models.DateTimeField(auto_now= True)
    
    class Meta:
        db_table = "users"

[Mission 3] 회원가입 기능 구현

  • 사용자 정보는 이름, 이메일, 비밀번호, 연락처(휴대폰), 그 외 개인정보를 포함한다.
  • 이메일이나 패스워드가 전달되지 않을 경우, {"message":"KEY_ERROR"}, status code 400 을 반환합니다.
  • 이메일에는 @와 .이 필수로 포함되어야 합니다. 해당 조건이 만족되지 않은 경우 적절한 에러를 반환해주세요. 이 과정을 Email Validation이라고 합니다. 정규표현식을 활용해주세요.
  • 비밀번호는 8자리 이상, 문자, 숫자, 특수문자의 복합이어야 합니다. 해당 조건이 만족되지 않은 경우, 적절한 에러를 반환해주세요. 이 과정을 Password Validation이라고 합니다. 정규표현식을 활용해주세요.
  • Email validation, Password Validation 과정에서 정규식을 사용해보세요.
  • 회원가입시 서로 다른 사람이 같은 이메일을 사용하지 않으므로 기존에 존재하는 자료와 중복되면 안됩니다. 적절한 에러를 반환해주세요.
  • 회원가입이 성공하면 {"message": "SUCCESS"}, status code 201을 반환합니다.
import json , re , bcrypt , jwt

from django.http import JsonResponse
from django.views import View
from django.conf import settings

from .models import User

class SignUpView(View):
    def post(self, request):
        try: 
            data = json.loads(request.body)
            name            = data['name']
            email           = data['email']
            password        = data['password']
            phone           = data['phone']
            date_of_birth   = data['date_of_birth']
            
            PASSWORD_CHECK  = '^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$'
            EMAIL_CHECK     = '^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
        
            if User.objects.filter(email = email).exists():
                return JsonResponse({"massage":"REGISTERED."}, status=401)
            
            if not re.match(EMAIL_CHECK, email): 
                return JsonResponse({"massage":"INVALID_EMAIL."}, status=401)
            
            if not re.match(PASSWORD_CHECK, password):
                return JsonResponse({"massage":"INVALID_PASSWORD."}, status=401) 
            
            hashed_password      = bcrypt.hashpw(password.encode('utf-8') , bcrypt.gensalt()).decode('utf-8')
            User.objects.create(
                        name            =  name,
                        email           =  email,
                        password        =  hashed_password,
                        phone           =  phone,
                        date_of_birth   =  date_of_birth
                    )
            return JsonResponse({'message':'SUCCESS'}, status=201)
        except KeyError:
            return JsonResponse({'message':'KEY_ERROR'}, status=401)

json, 정규식, bcrypt 등 여러가지 처음 보는 것들이 많았다. 하나하나 익히는 과정이 조금 버겁기는 했었다. 멘토님들은 컨벤션이나 깔끔한 코딩을 위해 많은 피드백을 남겨주셨다. filter 와 get에 대한 이해를 위해 쿼리셋도 많이 공부를 해야했었다.

[Mission 4,5,6] 로그인 기능 구현 , 회원가입 비밀번호 암호화 적용 , JWT 발급

  • 로그인 정보(이메일, 비밀번호)
  • 로그인을 할 때는 사용자 계정과 비밀번호가 필수입니다.
  • 계정이나 패스워드 키가 전달되지 않았을 경우, {"message": "KEY_ERROR"}, status code 400 을 반환합니다.
  • 계정을 잘 못 입력한 경우 {"message": "INVALID_USER"}, status code 401을 반환합니다.
  • 비밀번호를 잘 못 입력한 경우 {"message": "INVALID_USER"}, status code 401을 반환합니다.
  • 로그인이 성공하면 {"message": "SUCCESS"}, status code 200을 반환합니다.
class SignInView(View):
    def post(self,request):
        try:
            data = json.loads(request.body)
            email          = data["email"]
            input_password = data["password"]
            user = User.objects.get(email= email)
            
            checkpw_input_db = bcrypt.checkpw(input_password.encode('utf-8'), user.password.encode('utf-8') )
            
            if not checkpw_input_db:
                return JsonResponse( {'message' : 'INVALID_PASSWORD.' } , status = 401)
            new_token = jwt.encode( {"user": user.id } , settings.SECRET_KEY , algorithm= settings.ALGORITHM)
            return JsonResponse({"token": new_token , "massage" : "we did it" } , status = 200)
        
 
        except KeyError:
            return JsonResponse({"message": "KEY_ERROR"}, status=401)
        except User.DoesNotExist:
            return JsonResponse({'massage':"INVALID_EMAIL"}, status=401)

checkpw를 통해 JWT토큰이 나왔을 때 박수가 저절로 나왔다. 그 후 프론트 분들과 통신에서 내가 만든 view들이 정상적으로 작동할 때 조원끼리 다 웃으면서 "와 코딩 나랑 잘 맞는것 같아 너무 재밌어!" 라고 말했다.너무 긴장한건 사실 비밀. 후에 이뤄질 1차 프로젝트도 힘들지만 재밌게 해내길 미래에 나에게 기도해본다.

profile
포기하는 그 순간이 바로 시합종료예요...

1개의 댓글

comment-user-thumbnail
2022년 3월 26일

수훈님 항상 화이팅 🔥

답글 달기