일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- fatal:not a git repository
- 코딩테스트
- 파이썬
- 항해99
- 백준
- Til
- print("""
- 개발자스터디
- 파이썬 int()
- 주니어개발자역량강화
- 개발자사이드프로젝트
- 파이썬 |
- 파이썬 map 함수
- 99클럽 #99일지 #코딩테스트 #개발자스터디 #항해 #til
- Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
- 99클럽
- not a git repository
- 주니어개발자멘토링
- 파이썬 클래스
- EnvCommandError
- 항해
- 99일지
- 파이썬 sep
- print sep
- 항해플러스
- vscode cp949
- cp949
- MomentumParameters
- 10430번
- 코딩부트캠프후기
- Today
- Total
선발대
[원티드] 3주차 수요일 / dj-rest-auth 에러 수정 본문
오늘 새벽 2시까지 팀장님과 함께 에러를 수정하며 결국 dj-rest-auth를 알맞게 커스텀하였다.
엄청난 대장정이었다. dj-rest-auth 깃허브에 들어가서 파일 하나씩 다 뜯어보고 하나씩 우리 모델에 맞게 수정해봤다.
결국 로그인 시리얼라이저만 커스텀하고 나머지 기능은 그대로 사용하는 방식으로 간단히 끝낼 수 있었다.
결과물이 탄생한 과정은 아래와 같다.
이전에 우리 팀 유저 모델에서 유저 pk를 id(uuid 형태)로, 유저 아이디를 user_id로 작명했었다.
그런데 dj-rest-auth에서 로그인을 하면 user라는 변수가 정의되는데
여기에서 계속 user_id와 uuid 형태의 id가 서로 데이터 타입이 맞지 않는다며(당연함) 에러가 발생했다.
한참 동안 팀장님과 이것저것 시도해보다가 너무 안 풀려서 라이브러리 사용 포기 직전까지 갔었다.
그러다가 혹시 user 변수명이 서로 비슷해서 그런가 싶어서 user_id를 account로 변경했더니 바로 해결되었다.
와우! 포스트맨에서 결과가 딱 나오자 퇴근할 수 있다는 생각에 갑자기 정신이 맑아졌다.
어쨌든 푸시는 아침에 하기로 하고 자러 갔다.
- SimpleJWT 사용법이 적힌 홈페이지
- dj-rest-auth 사용법이 적힌 홈페이지
- Postman에서 csrftoken 에러가 생길 때는 이곳 확인
- 나와 동일하게 django-rest-auth를 커스텀하고 싶었던 사람
- dj-rest-auth 깃허브
- dj-rest-auth documentation
- dj-rest-auth 사용법을 친절하게 가르쳐주는 페이지
자고 일어나서 다시 아침 9시부터 작업을 이어서 진행했고, 무사히 기능 구현이 끝나서 PR 했다.
회원가입을 담당하신 팀원 분의 코드와 병합 순서를 맞추고 내 브랜치도 잘 병합되었다.
develop에서 새롭게 pull 받고 다시 개인 브랜치에 rebase 한 뒤 runserver를 돌렸는데 갑자기 에러가 생겼다.
알고 보니 rebase 과정 중에서 로그인 시리얼라이저에 data['user']=user 이라는 한 줄이 누락되어서 생긴 에러였다.
다시 PR을 보낸 뒤에 테스트 코드를 작성했다. 그러다 오후에 팀장님이 코드 작성 중 로그인 에러가 발생했다는 소식을 들고 오셨다.
(우리 팀은 팀 디스코드를 따로 개설하고 각각의 음성채널에서 작업한다.)
request.user로 현재 로그인한 유저를 호출할 때,
각각 다른 계정으로 로그인했음에도 최종 로그인된 유저가 호출되는 에러였다.
예를 들어 1번 유저가 로그인 한 뒤 곧바로 2번 유저가 로그인을 했다면
최종 로그인한 유저는 2번이므로 1번 유저 환경에서도 2번 유저가 request.user로 나타난다.
일단 임시로 views.py를 생성해서 request.user를 출력해봤다.
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
class tokencheck(APIView):
permission_classes = [IsAuthenticated]
def get(self, request):
print(request.user.id)
return Response({"data": request.user.id})
우여곡절 끝에 알고 보니 내가 settings.py에서 인증 방식에 세션과 JWT 두 개의 옵션 다 넣어뒀던 것이었다.
아마 옵션 설정할 때 기본값도 같이 포함시켰던 모양이다. 작은 설정 옵션에서 나온 에러였다. (그래도 이전까지 한참 고민함)
내 화면공유를 보며 이것저것 해결책을 알려주신 팀장님께도 감사했다.
# 잘 작동하는 코드
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.AllowAny',
],
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
'dj_rest_auth.jwt_auth.JWTCookieAuthentication',
),
}
# 아래의 옵션이 위의 DEFAULT_AUTHENTICATION_CLASSES에 들어가 있었다.
# 'rest_framework.authentication.SessionAuthentication',
기능 구현은 끝났고 오후에 로그인, 로그아웃 테스트 코드 작성도 마무리해서 PR 요청했다.
내일 오전에는 리뷰 대응 끝내고 마무리할 수 있을 것 같다. 이번 프로젝트도 거의 끝나간다.
'원티드 > 활동 내용' 카테고리의 다른 글
[원티드] 1주차 수요일 / 개발환경 세팅 (0) | 2022.06.29 |
---|---|
원티드 프리온보딩 백엔드코스 소개 + 지원(합격) (0) | 2022.06.22 |