[TIL] 장고 Serializer 활용 + 개인과제 해설
> 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에서 빼준 것
- 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 요청!'})