class UserView(View):
def post(self, request):
new_user = json.loads(request.body)
if User.objects.filter(user_name=new_user['user_name']).exists():
return JsonResponse({'message' : '이미 존재하는 아이디입니다.'}, status=400)
else:
password = bytes(new_user['user_password'], "utf-8")
hashed_password = bcrypt.hashpw(password, bcrypt.gensalt())
new_user = User(
user_name = new_user['user_name'],
user_password = hashed_password.decode("UTF-8"),
user_gender = new_user['user_gender']
)
new_user.save()
user_settings = UserOption(
hate_hot = False,
hate_cold = False,
user = new_user
)
user_settings.save()
return JsonResponse({'message' : '회원가입을 축하드립니다.'}, status=200)
우선적으로 user_name 에 아무것도 적지 않았을경우 ,
물론 프론트 단에서 해결을 할 수 있는 문제지만 , 백엔드 에서도 처리를 해줘야한다 .
그래서 항상 None 값이 들어오는것에 대해 대비를 해야한다.
class UserView(View):
def post(self, request):
try :
new_user = json.loads(request.body)
name = new_user.get('user_name' , None)
password = new_user.get('user_password' , None)
gender = new_user.get('user_gender' , None)
if User.objects.filter(user_name=name).exists():
return JsonResponse({'message' : '이미 존재하는 아이디입니다.'}, status=400)
new_user = User(
user_name = name
user_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
user_gender = gender
).save()
user_settings = UserOption(
hate_hot = False,
hate_cold = False,
user = new_user
).save()
return return HttpResponse(status=200)
except TypeError:
return JsonResponse({'message':'INVALUD_TYPE'},status=400)
이렇게 바꿀 수 있겠다 . 그런데 만약 user_name 과 등등이 None 같이 들어가면 안된다고 하면 아마 .. 또 코드가 달라졌을것 같다 .
class AuthView(View):
def post(self, request):
login_user = json.loads(request.body)
try:
user = User.objects.get(user_name=login_user['user_name'])
encoded_jwt_id = jwt.encode({'user_id' : user.id}, wtwt_secret, algorithm='HS256')
if bcrypt.checkpw(login_user['user_password'].encode("UTF-8"), user.user_password.encode("UTF-8")):
return JsonResponse(
{
"access_token" : encoded_jwt_id.decode("UTF-8"),
"user_gender" : user.user_gender
}
)
else:
return JsonResponse({'message' : '비밀번호를 다시 확인해주세요.'}, status=400)
except ObjectDoesNotExist:
return JsonResponse({'message' : '등록되지 않은 아이디입니다.'}, status=400)
except Exception as e:
print(e)
return HttpResponse(status=500)
로그인 하는 view 인것 같은데 일단은 AuthView 라는 naming 만 보고 저것이 로그인 하는 view 인것을 확인 할 수 있을까 ?? 라는 생각이 들었다.
그리고 print 같은경우 지워주는것이 좋다.
class AuthView(View):
def post(self, request):
login_user = json.loads(request.body)
try:
user = User.objects.get(user_name=login_user['user_name'])
if bcrypt.checkpw(login_user['user_password'].encode("UTF-8"),user.user_password.encode("UTF-8")):
jwt = jwt.encode({'user_id' : user.id},
wtwt_secret,
algorithm='HS256').decode("UTF-8") # algorithm 같은경우도 my_settings 에 빼는것이 좋다.
return JsonResponse(
{
"token" : jwt
"user_gender" : user.user_gender},status=200)
return HttpResponse(status=400)
except ObjectDoesNotExist:
return HttpResponse(status=400)
except TypeError:
return HttpResponse(status=400)
def login_decorator(f):
def wrapper(self, request, *args, **kwargs):
access_token = request.headers.get('Authorization', None)
try:
if access_token:
decoded = jwt.decode(access_token, wtwt_secret, algorithms=['HS256'])
user_id = decoded["user_id"]
user = User.objects.get(id=user_id)
request.user = user
return f(self, request, *args, **kwargs)
else:
return HttpResponse(status=401)
except jwt.DecodeError:
return HttpResponse(status=401)
return wrapper
개인적인 생각으로 f 보다는 알아볼 수 있게 function 이라던지 func 까지 naming 을 해주는것이 더 좋을 것 같다는 생각을 한다 .
그리고 else 문 같은경우는 빼도 아무런 지장이 없을 것 같다 .
def login_decorator(func):
def wrapper(self, request, *args, **kwargs):
access_token = request.headers.get('Authorization', None)
try:
if access_token:
decoded = jwt.decode(access_token,
wtwt_secret,
algorithms=['HS256'])
user_id = decoded["user_id"]
user = User.objects.get(id=user_id)
request.user = user
return func(self, request, *args, **kwargs)
return HttpResponse(status=401)
except jwt.DecodeError:
return HttpResponse(status=401)
return wrapper
class HeartView(View):
@login_decorator
def post(self, request):
user = request.user
cloth = json.loads(request.body)
cloth_id = cloth['img_id']
cloth = Cloth.objects.get(id = cloth_id)
if cloth.hearts.filter(id = user.id).exists():
cloth.hearts.remove(user)
heart_cloth = False
else:
cloth.hearts.add(user)
heart_cloth = True
return JsonResponse({"total_hearts" : cloth.total_hearts, "heart_cloth" : heart_cloth})
@login_decorator
def get(self, request):
user = request.user
hearts = HeartTime.objects.filter(user_id=user.id).values('cloth_id','heart_time').order_by('-heart_time')
hearts_list = list(hearts)
cloth_id = [
{
'img_id' : d['cloth_id'],
'img_ref' : Cloth.objects.get(id = d['cloth_id']).img_ref,
'page_ref' : Cloth.objects.get(id = d['cloth_id']).page_ref,
'total_hearts' : Cloth.objects.get(id = d['cloth_id']).total_hearts
} for d in hearts_list
]
return JsonResponse({'hearts_list' : cloth_id})
이코드를
class HeartView(View):
@login_decorator
def post(self, request):
user = request.user
cloth_data = json.loads(request.body)
cloth_id = cloth_data.get('img_id' , None)
cloth = Cloth.objects.get(id = cloth_id)
if cloth.hearts.filter(id = user.id).exists():
cloth.hearts.remove(user)
heart_cloth = False
else:
cloth.hearts.add(user)
heart_cloth = True
return JsonResponse({"total_hearts" : cloth.total_hearts,
"heart_cloth" : heart_cloth} , status=200)
@login_decorator
def get(self, request):
user = request.user
heart_list = HeartTime.objects.filter(user_id = user.id).select_related('cloth').order_by('-heart_time').all()
cloth_id = [
{
'img_id' : hearts.cloth_id,
'img_ref' : hearts.cloth.img_ref,
'page_ref' : hearts.cloth.page_ref
'total_hearts' :hearts.cloth.total_hearts
} for hearts in heart_list]
return JsonResponse({'hearts_list' : cloth_id},status=200)
일단 이렇게 바꿨는데 사실 이 코드도 ..
저기 post 부분에서도 else 문을 알쓰고 할 수 있었을 것이다 .