프로젝트 1차 [오설록 클론코딩]

인간·2022년 7월 24일
0

카테고리 모델링이다.

from django.db import models

class FirstCategory(models.Model):
    title = models.CharField(max_length=50)

    class Meta:
        db_table = 'first_categories'

class SecondCategory(models.Model):
    title          = models.CharField(max_length=50)
    first_category = models.ForeignKey(FirstCategory, on_delete=models.CASCADE, related_name='second_categories')

    class Meta:
        db_table = 'second_categories'

첫번째 카테고리로는 티 제품, 티 푸드 , 티웨어
두번째 카테고리는 티 세트, 블렌디드 티, 허브티, 밀크티, 아이스티

from django.db       import models

class Cart(models.Model) :
    user     = models.ForeignKey('users.User', on_delete=models.CASCADE)
    product  = models.ForeignKey('products.Product', on_delete=models.CASCADE)
    quantity = models.IntegerField(default=0)
    
    class Meta :
        db_table = 'carts'

카트는 제품과 유저로부터 외래키를 받고 수량을 받을 수 있게
만들었다.

뷰(VIEW)설명

import json
import re

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

from users.models  import User

class SignUpView(View):
    def post(self, request):
        try:
            data           = json.loads(request.body)

            name          = data['name']
            username      = data['username']
            password      = data['password']
            mobile_number = data['mobile_number']
            birth_day     = data['birth_day']

            REGEX_ID       = '^[a-zA-Z0-9]{4,12}$'
            REGEX_PASSWORD = '^(?=.*[a-z])(?=.*\d)(?=.*[$@$!%*#?&])[a-z\d$@$!%*#?&]{8,16}$'
            REGEX_BIRTHDAY = '^(19\d{2}|20\d{2})-(0[0-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$'
            

            if not re.match(REGEX_ID, username):
                return JsonResponse({"message":"ID_VALIDATION_ERROR"}, status=400)

            if not re.match(REGEX_PASSWORD, password):
                return JsonResponse({"message":"PASSWORD_VALIDATION_ERROR"}, status=400)

            if not re.match(REGEX_BIRTHDAY, birth_day):
                return JsonResponse({"message":"BIRTHDAY_VALIDATION_ERROR"}, status=400)
            
            if User.objects.filter(username = username).exists():
                return JsonResponse({"message":"DUPLICATION_ERROR"}, status=400)
        
            hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')

            User.objects.create(
                name          = name,
                username      = username,
                password      = hashed_password,
                mobile_number = mobile_number,
                birth_day     = birth_day,
            )
            return JsonResponse({'message':'SUCCESS'}, status=201)
            
        except KeyError:
            return JsonResponse({"message":"KEY_ERROR"}, status=400)

class LogInView(View):
    def post(self, request):
        try:
            data     = json.loads(request.body)

            username = data['username']
            password = data['password']

            user = User.objects.get(username = username)

            if not bcrypt.checkpw(password.encode('utf-8'), user.password.encode('utf-8')): 
                return JsonResponse({'message':'INVALID_USER'}, status=401)

            token = jwt.encode({"user_id":user.id}, settings.SECRET_KEY, settings.ALGORITHM)
            return JsonResponse({"message":"SUCCESS", "access_token": token}, status=200)
        
        except User.DoesNotExist:
            return JsonResponse({"message":"INVALID_USER"}, status=400)

        except KeyError:
            return JsonResponse({"message":"KEY_ERROR"}, status=400)

먼저 역할을 나눠서 민지님이 이걸 해주셨는데
지난번 과제때 한부분이라 코드를 보는데 크게 어려운 사항은 없었다.

import json

import jwt

from django.http        import JsonResponse
from users.models       import User
from django.conf        import settings

def login_decorator(func):
    def wrapper(self, request, *args, **kwargs):
        try:
            access_token = request.headers.get('Authorization')
            payload      = jwt.decode(access_token, settings.SECRET_KEY, settings.ALGORITHM)
            user_id      = payload['user_id']
            request.user = User.objects.get(id = user_id)

            return func(self, request, *args, **kwargs)

        except jwt.exceptions.DecodeError:
            return JsonResponse({ 'message' : 'INVALID_TOKEN' }, status = 400)
        
        except KeyError:
            return JsonResponse({ 'message' : 'KEY_ERROR' }, status = 400)

    return wrapper

이번 과제에 처음해본건 데코레이터라는 것이다. 역할분담때 역할을 나눠서 내가 직접 만든건 아니지만 그래도 보면서 이해할 수 잇었다. 함수를 정의하고 파라미터안에 다음 함수를 호출할 일므을 고대로 써준다. 그리고 다시 내부 함수를 정의하고 만들고 리턴 값으로 아까 입력해준 파라미터를 입력해준다 그럼 다시 함수위로 실행이 되어서 리턴값을 반환하고 다음 함수가 순차적으로 진행된다.

3차때 계속

profile
잇츠미

0개의 댓글