TIL.40 1차 프로젝트에서 공부한 부분

kimst5418·2020년 11월 1일
0

wecode

목록 보기
24/30

1) **dictionary

프로젝트를 진행하며 다양한 조건으로 필터링 해야하는 경우가 있었는데 dictionary를 사용하면 코드 중복을 줄이는 데 효과적이다는 것을 배울 수 있었다.

# python dictionary 
>>> d1 = {"a":1, "b":2}
>>> d2 = {"b":1, "d":2}
>>> d1.update(d2)
>>> d1
{'a': 1, 'b': 1, 'd': 2}
>>> d3= dict(c=3, d=4)
>>> d4=dict(d2,**d3)   # d2 를 베이스로 d3로 덮어 쓴다
>>> d4
{'b': 1, 'd': 4, 'c': 3}

>>> e = {'hello' : 'world'}
>>> def foo (hello) :
	print(hello)
>>> foo(**e)          # 함수의 인수로 **dictionary 를 사용할 경우 key=value 로 인식한다.
world


# 프로젝트에서 사용한 코드
filter_dict = {}

if sort == '피드':
	filter_dict.update({'user__in' : request.user.following.all()}) 
if category_id:
	filter_dict.update({'category_id' : category_id})

works = Work.objects.filter(**filter_dict).select_related("user").prefetch_related("workimage_set", "likeit_set", "comment_set")

2) 로그인 token 인증 데코레이터

import jwt

from django.http import JsonResponse
from my_settings import SECRET, ALGORITHM
from .models     import User

def login_decorator(func):
    def wrapper(self, request, *args, **kwargs):
        try:
            access_token = request.headers.get('Authorization')
            if access_token:
                payload = jwt.decode(
                    access_token,
                    SECRET["secret"],
                    algorithm=ALGORITHM["algorithm"]
                )
                user = User.objects.get(id=payload['user_id'])
                request.user = user
            else:
                request.user = False
        except jwt.exceptions.DecodeError:
            return JsonResponse({'MESSAGE': 'INVALID_TOKEN'}, status=400)
        except User.DoesNotExist:
            return JsonResponse({'MESSAGE': 'INVALID_USER'}, status=400)

        return func(self, request, *args, **kwargs)
    return wrapper
  • 사이트에서 로그인을 안 했을시에도 data를 보내줘야하는 상황이 있어 이를 해결하고자 access_token이 있을 때와 없을 때를 구분하여 코드를 작성하였는데 데코레이터에서 이부분을 정리하는게 맞는지 좀더 공부해 봐야겠다.
  • 프로젝트 기간 데코레이터를 처음으로 사용해봤는데 앞으로 적합한 상황이 생긴다면 더 적극적으로 사용해야겠다.

3) if else one line

class TopCreatorsView(View) :

    @login_decorator
    def get(self, request) :
        CONST_LENGTH = 9
        creators    = User.objects.all().prefetch_related('work_set')
        creatorlist = [ {
            "id"                : creator.id,
            "user_name"         : creator.user_name,
            "profile_image_url" : creator.profile_image_url,
            "followBtn"         : creator.creator.filter(follower_id=request.user.id).exists() if request.user else False,
            "likecount"         : sum([ work.likeit_set.count() for work in creator.work_set.all() ]),
        } for creator in creators ]
        creatorlist = sorted(creatorlist, reverse=True, key=lambda x: x["likecount"])[:CONST_LENGTH]
        return JsonResponse({'topCreators': creatorlist }, status=200)
  • followBtn 을 유저가 로그인 안했을때, 즉 request.user 값이 없을 땐 False로 응답해주고 싶은 상황 이였다. 처음엔 바깥부분에서 if 를 사용하여 코드중복이 많았었지만 if else 문을 한줄에 사용하여 코드를 많이 줄일 수 있었다.

4) django

=> filter(`field`__in)
Entry.objects.filter(id__in=[1, 3, 4])
Entry.objects.filter(headline__in='abc')

# SQL equivalents
SELECT ... WHERE id IN (1, 3, 4);
SELECT ... WHERE headline IN ('a', 'b', 'c');


=> first(), last()
In [56]: u=User.objects.all()

In [57]: u[0]
Out[57]: <User: User object (1)>

In [58]: User.objects.first()
Out[58]: <User: User object (1)>

In [59]: User.objects.last()      #u[-1] 와 같아야 겠지만 queryset은 -1 인덱스를 지원하지 않는다.
Out[59]: <User: User object (39)>
profile
TIL 기록 일지

0개의 댓글