이번 drf개인과제에서는 simplejwt를 auth에 사용하고 있다.
그런데 로그아웃 코드를 작성했는데, 계속 오류가 발생했다.
당시에 작성한 코드는 다음과 같았다.
"logout/" url경로로 들어오면 프로젝트 폴더의 urls.py를 거쳐("api/accounts") 로그아웃 뷰가 처리된다.
즉, "/api/accounts/logout/"경로이다.
가장 이해가 안됐던 것은 LogoutAPIView 클래스도 post()로만 작성한 상태였는데(분기 처리도 없이), 왜 POST요청이 Allow되지 않는다는 오류메시지가 뜨는가였다.
이 문제를 해결하기 위해 내가 시도해본 해결방법은 다음과 같다.
1. postman의 url을 확인
RESTful API를 개발하고 있기 때문에 FE단을 만들지 않으므로, 개발단계에서 postman으로 요청이 잘 처리되는지를 확인하고 있다.
postman에서 요청을 보내는 url이 정확하지 않으면 오류가 날 수 있으므로, 이를 확인해봤다. 하지만 오류 없이 POST method로 요청이 잘 들어가고 있었다.
cf. 지난번에 DELETE method로 req를 보냈을 때, url마지막의 "/"를 빼먹어서 계속 오류났었다.
->이것까지 잘 확인해봤지만, url에는 문제가 없었다.
또 토큰이 문제인가 싶어 access token을 빼고도 req를 보내봤는데, 이 경우에는 "auth crudential이 제공되지 않았다"는 오류메시지가 출력되었다.
-> token 문제는 아닌걸로.
2. request method를 바꿔봄
너무 답답했던 나머지..postman의 response의 header정보의 "Allow"란에 POST는 없고, GET이 있길래 GET요청을 보내봤다. (cf. 로그아웃은 일반적으로 POST 사용)
그런데 결과가 이상하게 ProfileView의 예외처리 message로 설정해둔 "존재하지 않는 사용자입니다"가 response로 반환되었다. 당시에는 뭐지?했었는데, 나중에 보니 이 response가 문제해결의 실마리였다..
3. 코드자체를 수정
LogoutAPIView의 코드 자체를 이리 저리 바꿔봤지만, 사실 view자체의 로직에는 문제가 없었다.
결과도 여전히 같은 오류 메시지인 "method POST not allowed"였다.
4. 내장 view로 변경
내가 작성한 APIView말고, drf-simplejwt에서 제공하는 내장 view인 "TokenBlacklistView"를 사용해봤다.
이는 로그인에서 TokenObtainPairView를 썼던 것과 마찬가지로 기본세팅만 해주면 내가 별도로 view를 작성해주지 않아도 작동한다.
(cf. settings.py의 INSTALLED_APP에 등록하는 것 잊지 말기!)
하지만 결과는 여전히 같은 오류 메시지인 "method POST not allowed"에서 변하지 않았다.
5. url순서 바꿔줌
아까 get요청시에 ProfileView의 코드가 실행된게 걸려서, accounts/urls.py의 path순서를 조정해줬다.
즉, profile url이 제일 끝으로 가도록 수정해줬다.
그 결과, 드디어 오류가 해결됐다.
지금 보니, urls를 순서대로 타고 내려오면서 req로 받은 url과 대조하면서 같은지 검사하는데, 매개변수 <str:username>의 영향으로 logout을 username처럼 매개변수로 인식해서 발생한 문제였던 듯 하다!
즉, 이런 문제를 방지하기 위한 url작성 방법은 2가지가 있다.
(1) url위치를 그대로 하고 싶다면:
path('profile/<str:username>/',views.ProfileView.as_view()),
처럼 혼동이 없게 url경로 자체를 수정해주면 된다.
(2) url위치를 변경:
나는 개인과제의 조건사항에 이미 url경로가 특정하게 지정되어 있었으므로, url의 순서를 조정하여 오류를 해결했다.
즉, pk나 username과 같은 매개변수가 있는(esp. <str:username>) url의 경우에는 가장 끝으로 보내주면 된다.
'TIL' 카테고리의 다른 글
[TIL 2024. 05. 02] 웹 서버 | 웹 애플리케이션 서버 (0) | 2024.05.03 |
---|---|
[TIL 2024. 05. 01] DRF 개인과제 오류수정(2) (0) | 2024.05.02 |
[TIL 2024. 04. 29] 모의면접 회고록 (0) | 2024.04.30 |
[TIL 2024. 04. 26] 파이썬이 느린 이유 | 데코레이터 | 파이썬 메모리 관리 (0) | 2024.04.29 |
[TIL 2024. 04. 25] Python GIL | 메모리 관리 (0) | 2024.04.25 |