해결된 질문
작성
·
375
0
안녕하세요 강사님
강사님의 강의 열심히 듣고있는 학생입니다. 항상 꼼꼼한 강의 해주셔서 감사합니다.
강의를 들으며 실습을 진행하던 중, attribute 에러가 발생하여 질문납깁니다.
django와 react로 front, backend를 구분하여 실습하고 있었으며, backend/instagram/views.py 에서 query_set 필터를 통해 frontend/postList.js에 나타날 게시물을 표현하는 과정에서 해당 오류가 발생하였습니다.
현재 backend/instagram/views.py는 아래와 같습니다.
또, backend/accounts/models.py의 User에서 following_set을 정의한 것은 아래와 같습니다.
답변 2
1
안녕하세요.
아래의 에러가 발생하셨는 데요.
AnonymusUser object hsa no attribute following_set.
PostViewSet 의 get_queryset 내에서 qs.filter 코드 중에 request.user 와 request.user.following_set 참조 코드가 있습니다.
인증이 되지 않았을 때의 request.user 는 AnonymousUser 클래스의 인스턴스가 됩니다. 인증이 되면 request.user 는 User 모델의 인스턴스가 되구요. following_set은 User 모델에만 존재하는 속성이니까, AnonymousUser 클래스에는 없는 속성입니다. 그러니 보여주신 AttributeError가 발생하는 것이구요.
그러니 해당 filter를 수행하기 위해서는 인증된 상황이 필요한데,
지금의 상황은 현재의 요청이 인증이 되지 않은 상황에서 filter가 수행된 것이죠.
settings.REST_FRAMEWORK에서 permission classes 설정은 다른 값으로 세팅이 안 되어있는 거죠?
보여주신 코드의 PostViewSet의 permission_classes도 주석으로 처리되어있구요.
그렇다면 PostViewSet의 permission classes는 디폴트로 AllowAny일 것입니다.
인증없이도 API 호출이 되는 거죠.
클라이언트 단에서의 API 요청이 Authorization 헤더를 세팅하셔서, 해당 요청이 인증될 수 있도록 해주시고.
서버 단에서도 permission_classes에서 IsAuthenticated를 추가해주는 것이 좋습니다.
화이팅입니다. :-)
덧: 본 질문이 해결되셨다면, 해결됨으로 질문의 상태를 변경 부탁드립니다.
0
강사님 , 답변 감사합니다.
backend/settings/common.py에서 rest framework_simplejwt 를 사용하여 구현하여 진행했습니다.
처음에는 default_authentication_classes에
rest_framework_simplejwt.authentication.JWTAuthentication으로만 진행했었고,
강사님 답변 이후에 sessionAuthentication과 permissions_Class를 아래와 같이 추가했습니다.
그리고 frontend/src/components/PostList.js에서 headers가 인증받도록 구현했습니다.
그랬더니 이번에는 401 unauthorized error 가 발생했습니다.
맨 처음 수정했던 setiings의 permission을 없애면 다시 500 error와 AnonymusUser error가 발생합니다.
인증이 없이 접근하면 401 응답을 받게 되고
퍼미션 체크를 없애면 인증없이 수행되니 처음 말씀하신 AttributeError가 발생하여 500에러가 뜨는 것이 맞습니다. 브라우저 개발자 도구의 network 탭에서 에러 응답 화면을 확인하실 수 있습니다.
drf simplejwt 라이브러리를 사용하셨다면 auth header type은 JWT가 아니라, 디폴트로 Bearer입니다. 이는 아래 공식문서에서 확인하실 수 있습니다.
https://django-rest-framework-simplejwt.readthedocs.io/en/latest/settings.html
라이브러리를 사용하실땐 공식문서를 꼼꼼하게 보실 필요가 있습니다.
아마도 이로 인해 인증 체킹이 되지 않았을 듯 합니다.
이렇게도 해결이 안된다면, token 값을 잘못 지정하셨거나 헤더키 이름에 오타가 있으시거나, 엉뚱한 코드를 실행하셨거나, 다양한 이유가 있을 수 있습니다.
화이팅입니다. :-)