[django]1st project 4일차

전예찬·2022년 4월 28일

1st project

목록 보기
3/4

오늘 한 일들

  1. git에 my_settings.py 추적 끊기
  2. 로그인 회원가입 api생성

1. git에 my_settings.py 추적 끊기

오늘 아침 git을 보는데 깜짝놀랐습니다. 왜냐하면 database 정보와 secret_key 정보가 담겨있는 git에 그대로 올라와 있었습니다. 그래서 저는 부랴부랴 .gitignore라는 git에 추적을 피하는 파일을 만들어 줬는데 여전히 추적이 됬었습니다. 그래서 구글링을 통해 해결하였습니다.
고것은 바로 git의 캐시를 삭제해 준 후 다시 푸시해보니 더 이상 git에 추적되지 않은 것을 볼수있습니다~~

git rm -r --cached .
git add .
git commit -m 'fixed untracked files'

2. 로그인 회원가입 api생성

드디어 프론트와 연결해 볼 수 있는 시간이 왔습니다.호호
먼저 회원가입 api 부터 살펴 보겠습니다.

import json, bcrypt, jwt
from os import access

from django.http            import JsonResponse
from django.views           import View
from users.models           import User
from django.core.exceptions import ValidationError
from users.validation       import Validation
from django.conf            import settings

class SignUpView(View):
    def post(self, request):
        try:
            data         = json.loads(request.body)
            email        = data['email']
            password     = data['password']
            name         = data['name']
            phone_number = data['phone_number']
            birth_date   = data['birth_date']
            address1     = data['address1']
            address2     = data['address2']

            if User.objects.filter(email=email).exists():
                return JsonResponse({'message':'ALREADY_EXISTS'},status=400) #하나의 email에 하나의 계정만 생성할 수 있게 해주었습니다.

            Validation.email_validate(email) #valiation을 모듈화 하여 만들어 줬습니다 
            Validation.password_validate(password)

            hashed_password = bcrypt.hashpw(password.encode('utf-8'),bcrypt.gensalt()).decode('utf-8')
            #비밀번호를 암호화 해줍니다. 
            User.objects.create(
                email        = email,
                password     = hashed_password, #암호화된 비밀번호를 받습니다.
                name         = name,
                phone_number = phone_number,
                birth_date   = birth_date,
                address1     = address1,
                address2     = address2
            )
            return JsonResponse({'message':'SUCCESS'},status=200)

        except KeyError:
            return JsonResponse({'message':'KEY_ERROR'},status=400)
        except ValidationError as error:
            return JsonResponse({'message':error.message})

위와 같은 코드로 회원가입api를 만들어 주었습니다.

이제 email과 password의 형태를 결정 해주는 validation.py를 살펴 봅시다.

import re

from django.core.exceptions import ValidationError

regex_email    = '^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9_-]+\.[a-zA-Z0-9-.]+$'
regex_password =  '^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d~!@#$%^&*()+|=]{8,20}$' #'숫자', '문자' 무조건 1개 이상, '최소 8자에서 최대 20자' 허용

class Validation:
 def email_validate(value):
     if not re.match(regex_email,value):
         raise ValidationError('메일형식 이상함')
 def password_validate(value):
     if not re.match(regex_password,value):
         raise ValidationError('비밀먼호 형식 이상함')

정규식을 사용하여 regex_email 와 regex_password를 생성해 줍니다.
그리고 value값을 로 받은 값들을 비교하여 각각에 맞는 에러메세지를 보내 줍니다.

이제 회원가입을 보았으니 로그인기능 구현을 위한 코드를 살펴 보겠습니다.

class SignInView(View):
    def post(self,request):
        try:
            data = json.loads(request.body)
            user = User.objects.get(email=data['email'])

            if not bcrypt.checkpw(data['password'].encode('utf-8'),user.password.encode('utf-8')):
                return JsonResponse({'message':'INVALID_PASSWORD'},status=400) #데이터로 받은 비밀먼호와 회원가입때 받은 비밀번호를 인코딩 한 후 서로 비교한 뒤 다르다면 에러 메세지를 반환 합니다.

            access_token = jwt.encode({'id':user.id},settings.SECRET_KEY, algorithm=settings.ALGORITHM)

            return JsonResponse({'message':access_token},status=200)

        except KeyError:
            return JsonResponse({'message':'KEY_ERROR'},status=400)
        except User.DoesNotExist:
            return JsonResponse({'message':'INVALID_EMAIL'},status=400)

이런 식으로 로그인을 위한 코드를 만들어 주었습니다.

이제 views.py도 작성해 줬으니 urls.py를 수정 해줍니다.
먼저 메인 urls.py 작성해 봅시다.

from django.urls import path, include

urlpatterns = [
    path('users',include('users.urls'))    
]

이제 user app에 urls.py를 생성하고 코드를 작성해 줍니다.

from django.urls import path
from users.views import SignUpView, SignInView

urlpatterns = [
    path('/signup',SignUpView.as_view()), #user/signup
    path('/signin',SignInView.as_view()) #user/signin
]

이제 프론트와 연결되 준비가 끝났습니다.

python manage.py runserver 0:8000

런서버 하고 프런트와 연결하니 아주 성공적으로 연결 되었습니다.

추가적으로 카테고리에 카테고리에 대한 설명도 필요하다 느껴 카테고리에 디테일 항목을 추가해 줬습니다.

class Category(models.Model):
    name   = models.CharField(max_length=45)
    detail = models.CharField(max_length=300) 

    class Meta:
        db_table = 'categories'

요로케 수정해 줬습니다.

오늘 내가 한 일 끝~~

소감을 말하자면 오늘 프론트와 data를 주고 받으니 정말 프로젝트 하는 느낌이 났습니다. 이제 진짜 고생은 내일부터ㅜㅜ

profile
이제 시작

0개의 댓글