AI 웹개발반

[TIL] 장고 Serializer 활용 + 개인과제 해설

째깍단 2023. 5. 1. 22:05

 

> Serializer에서의 필드 설정

 

fields = "__all__"
extra_kwargs = {
    'password' : {'write_only' : True}
}

 

extra_kwargs는 읽기 쓰기 전용, required 등으로 활용해 필드 사용여부를 조정한다!

 

write_only 

read_only

required

...

 

 ** exclude는 아예 필드 자체를 제외하는 것

 

 

 

 

required = False 옵션을 사용하면 어떤 필드가 요구되지 않은 상태로 다음 단계로 넘어갈 수 있다.

 

extra_kwargs = {"user" :{“required” : False}},

 

 

   +  is_valid, save()는 write / 직렬화 read

 

 

 

 

 

 

 

> 역참조

 

UserSerializer에  ArticleSerialzer를 역참조해준다.

 

 

comment 역참조!

 

 

ArticleSerializer에 comments를 가져와서 역참조하도록 함

이때 이름은 related_name = “comments”   <- 이 이름을 똑같이 사용해야 적용된다.!

 

 

 

field에서 필요한 부분만 가져오기

SerializerMethodField()

 

 

 

 

 

 


 

 

 

DRF 개인 과제 해설에서 기억할 것

 

 

 

 

  • jwt token 하나를 install 하면서 상위 2개 django, django rest framework를 모두 설치할 수 있다!
pip install djangorestframework-simplejwt

 

 

 

 

  • 단계는 외우자!!!
def post(self,request):
    """내용 입력 받아 생성"""
    serializer = TodoSerializer(data=request.data)
    serializer.is_valid(raise_exception=True)
    serializer.save()

 

 

 

 

 

 

> User app

 

 

  • 성별 추가하기 를 choices로 만들어주기 (혹은 boolean으로도 하기도 함)
GENDERS = (
("F", "여성"),
("M", "남성"),
("None","공개하지 않음"),)

gender = models.Charfield("성별", max_length=10, choices=GENDERS)

 

 

 

 

 

  • settings.py 에 앱, 모델 추가해주기  + urls.py 에도 include!
AUTH_USER_MODEL = 'user.User'

INSTALLED_APPS = [
    'user',
    'todo',
]

 

 

 

 

 

 

  • 세션과 토큰, 로그인 로그아웃에서의 차이

 

세션 : 주문번호 : 12345678654321

   ㄴ 데이터를 서버에서 관리(db에서 delete하면 데이터가 없으니 확인 불가능) 

   ㄴ 서버에서 handling하기 쉽고  (장점)

   ㄴ 필요할때 서버에서 조회해줌    (단점: 서버 부하)

 

 

 

토큰 : 구매자: ~~ / 구매일자: ~~~, 만료일자 : ~~ / 티켓서명: ~~~ 서명에서 위 내용이 유효한지 확인

   ㄴ 사용자의 로컬 내에서 토큰 자체의 유효성만 판단함

   ㄴ 서버 db랑 비교할 필요 없음!  (장점)

   ㄴ 서버에서 관리할 수 없음         (단점)

   ㄴ 토큰의 로그아웃은 로컬스토리지에 저장된 토큰을 지우면 되기 때문에 프론트에서 해주면 된다!

 

   ㄴ access token의 기간을 짧게 설정, refresh를 블랙리스트에 등록. = 갱신이 안되면서 로그아웃이 됨!

 

   ㄴ jwt 권장사항 :

       access 짧게(5분) (만료되면 로그아웃됨)

       refresh 길게(30분)

 

+++

더보기

질문 & 답변

1)실무에서의 블랙리스트 앱은 특정 토큰을 차단하는 용도로 사용됨

 = 로그인이 되어있어도 아무것도 못하도록 

 

2) 토큰/ 세션 선택 기준은 따로 없음

 

 

 

 

 

 

  • Password 암호화 처리
    Serializer에서 create함수를 만들어주면 view에서 is_valid를 통과한 검증된 데이터가 들어오게된다.
    기본적으로 is_valid에서 유효하지 않은 값으로 걸러줌
    (source code를 보면 검증된 데이터가 담기는 것을 볼 수 있다)

    • validated_data
      그리고 password를 value에 따로 담아준 것임이후 set_을 사용하여 암호화 후 저장을 따로 해준다!
    • password 빼서 넣어줌!
      pop은 key를 기준으로 validated_data에서 빼준 것
#users.serializers.py
def create(self, validated_data):
    password = validated_data.pop("password")
    user = User(**validated_data)
    user.set_password(password)
    user.save()
    return super().create(validated_data)

 

 

 

 

 

  • 회원 탈퇴
    탈퇴는 보통 is_active 를 false로 바꾸어주고, 몇 년 후에 제거하는 방법을 사용한다.

def delete(self,request, pk):
    User.objects.get(pk=pk)
    
    # request.user.delete() 하면 안됨!
    # 계정 삭제했을 때 바로 삭제 하지 않는다! 비활성화를 한다!! 

    user = request.user
    user.is_acitve = False  # 로그인 기능 막기!
    user.save()

 

 

 


 

 

 

> Todo app

 

 

 

  • Todo 수정 2가지 방법
    - Patch : 일부 데이터
    - Put  : 전체 데이터

 

 

 

 

  • complete 여부 확인 작업
    모델 필드를 설정해주고
    view에서 처리 /  함수로 처리 2가지 방법이 있다!
class Todo(models.Model):
	...
    is_complete = models.BooleanField("완료 여부", default=False)
    completion_at = models.DateTimeField("완료 시간", null=True, blank=True)

 

 

  • UTC 시간 기준으로 저장 
    updated_at = models.DateTimeField("수정 시간", auto_now=True)
  • 컴퓨터 설정 시간 기준으로 저장해줌  (**utc_tz = false를 해야 db와 템플릿의 시간이 같게 출력)
    timezone.now()

 

# settings.py

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'Asia/Seoul'  # 한국 시간 적용 

USE_TZ = False  # False 로 설정해야 DB에 변경 된 TIME_ZONE 이 반영 됨

 

 

[참고하기] : 장고에서 시간 설정을 어떻게 해주는 것이 좋을까?

 

https://devlog.jwgo.kr/2020/10/28/using-timezone-in-django/

https://goodthings4me.tistory.com/536

 

 

 

 

 

  • view 에서 처리
def put(self, request, pk):
    """지정된 todo를 complete합니다."""
    obj = Todo.objects.get(pk=pk)
    obj.is_complete = True
    obj.completion_at = timezone.now()
    obj.save()
    return Response({'message':'login 요청!'})

 

 

 

 

  • complete 함수로 처리
from django.utils import timezone

def complete(self):
	self.is_complete = True
	self.completion_at = timezone.now()
	self.save()

 

def put(self, request, pk):
    """지정된 todo를 complete합니다."""
    obj = Todo.objects.get(pk=pk)
    obj.complete()
    return Response({'message':'complete 요청!'})