AI 웹개발반

[TIL] 오늘 공부, DRF 개인과제 진행 중

째깍단 2023. 4. 26. 21:26

오늘 한 것

[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

 

세션 키 삭제 + 사용자 로그인을 유지하고 싶을 때의 예제.

[참고]: https://stackoverflow.com/questions/16039399/how-to-clear-all-session-variables-without-getting-logged-out

 

 

 

 

 

 

- 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를 이해한 대로 정리해보아야겠다