카테고리 모델링이다.
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'
카트는 제품과 유저로부터 외래키를 받고 수량을 받을 수 있게
만들었다.
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차때 계속