[TIL] 오늘 공부, DRF 개인과제 진행 중
오늘 한 것
[O] : 알고리즘 페어프로그래밍 = 영어가싫어요/고양이
[O] : 장고 강의 듣기!
- [O] : 4주차 끝까지!
[△] : 개인과제 마무리 하기
- 할수 있을줄 알았지... 회원 수정기능에서 막힘
- [X] : todo list 클론코딩으로 완성하기
- [X] : 코드 이해하기
[O] : 후발대 Serializer 강의 듣기
개인과제 진행 중... +후발대 강의
복습한 것
- 로그아웃 기능
: 장고 logout 메서드를 활용한다.
: 발급했던 access token(과 refresh token)을 삭제해준다.
#urls.py
path('logout/', views.LogoutView.as_view(), name='logout'),
#views.py
from django.contrib.auth import logout
class LogoutView(APIView):
def post(self, request):
request.user.auth_token.delete() #현재 access 토큰을 지워줌
logout(request) #Django 내의 logout함수
return Response({'message': "Logout successful"})
> Logout 소스코드 보기
def logout(request):
# Dispatch the signal before the user is logged out so the receivers have a
# chance to find out *who* logged out.
user = getattr(request, "user", None)
if not getattr(user, "is_authenticated", True):
user = None
user_logged_out.send(sender=user.__class__, request=request, user=user)
request.session.flush()
if hasattr(request, "user"):
from django.contrib.auth.models import AnonymousUser
request.user = AnonymousUser()
내장 함수 logout에서는 logout할 주체인 request.user를 찾아주고 logout 하여 인증되지않는 사용자 상태로 바꾸어 준다
= 토큰에는 영향없음!
request.session.flush()
: Django 1.8버전부터 flush()가 세션 쿠키 삭제를 진행하며 사용자를 로그아웃 시키고 있다
[참고]: https://medium.com/geekculture/register-login-and-logout-users-in-django-rest-framework-51486390c29
세션 키 삭제 + 사용자 로그인을 유지하고 싶을 때의 예제.
- csrf token 예외처리
1) 해당 줄을 지우거나 주석처리 해준다
#settings.py
MIDDLEWARE = [
….
'django.middleware.csrf.CsrfViewMiddleware',
….
]
2) decorator를 사용한다
from django.views.decorators.csrf import csrf_exempt
From django.utils.decorators import method_decorator
@method_decorator(csrf_exemptm, name=‘dispatch’)
class Sample():
...
혹은 함수에 직접 @csrf_exempt를 붙여준다.
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def sample_def():
...
새롭게 알게 된 것
- 과제를 하며..
- serializer 선언 시 password 응답 예외 처리하기
extra_kwargs 로 password를 빼내어 user모델을 활용할 때 response에 password가 들어가지 않도록한다.
class UserSerializer(serializers.ModelSerializer) :
model = User
read_only_fields = ('email') #수정 불가능하도록 read-only로 설정
extra_kwargs = {
'password' : {'write_only' : True}
}
- 참조 시 many = True를 언제 쓰는가!
‘목록’을 불러올 때 결과물이 queryset이면 many=True를 넣어주도록 한다.
user = UserSerializer.objects.all()
return UserSeiralizer(user, many=True).data
느낀점:
오늘 후발대 강의는 serializer였다.
내일 개인과제 구현을 완료하고 복습을 진행하고,
금요일에 serializer를 이해한 대로 정리해보아야겠다