본문 바로가기

TIL

23.05.09 TIL

오늘은...

팀 프로젝트를 진행하였다.

1. DRF를 통해 token인증을 이용한 회원 가입 및 로그인 기능을 구현하였다.

2. test 코드를 작성했다.

 

1. python 버전 맞추기

각 팀월들의 로컬환경에 설치된 파이썬 버전이 모두 달랐다. 따라서 3.8.6 버전에 맞추어 가상환경을 설정하고 싶었는데, 어떻게 해야하는지 방법을 찾기 어려웠다.

 

시도 1 . -3.8.6 옵션

검색해 본 결과 3.8.6 버전 설치 후 아래와 같은 명령어를 통해 해결할 수 있다는 정보를 찾을 수 있었다.

python3 -3.8 -m venv venv

'-'를 1개도 써보고 2개도 써봤는데 둘 다 안된다.

 

시도 2. -py 명령어

검색해보니 아래와 같은 명렁어를 통해 해결할 수 있다는 정보도 있었다.

py -3.8 -m venv venv

그러나 py 명령어를 찾을 수 없다는 오류가 발생하였다.

 

해결: PATH 확인하기

python3 -m venv venv

위와 같은 명령어에서 python3은 실제로는 '파이썬 명령어가 저장된 위치'를 의미하며 이는 .zprofile 파일에서 확인할 수 있다.

# Setting PATH for Python 3.11
# The original version is saved in .zprofile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/3.11/bin:${PATH}"
export PATH

# Setting PATH for Python 3.8
# The original version is saved in .zprofile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/3.8/bin:${PATH}"
export PATH

여기서 3.8.6 버전의 PATH도 잘 지정되어있는것을 볼 수 있다.

 

하지만 기본적으로 python3 은 이미 설치된 3.11.2 버전을 가리키고 있다.

따라서 다음과 같이 하면 3.8.6버전의 파이썬으로 명령어를 실행가능하다.

python3.8 -m venv venv

 

2. migrate 오류

django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency user.0001_initial on database 'default'.

User모델을 만든 뒤 원격 레포지토리에서 PR-병합까지 한 뒤, 다른 팀원이 migrate를 하여 DB에 반영하려 하자 위와 같은 문제가 발생하였다. 그러나 이러한 문제는 내 저장소에서는 발생하지 않았다.

 

시도 1. migrations 파일 삭제 후 재생성

python3 manage.py makemigrations
python3 manage.py migrate

시도해 본 결과, 동일한 오류가 반복되었다.

 

해결:  DB 삭제

: Migration admin.0001_initial is applied before its dependency user.0001_initial

에러메시지를 잘 읽어보자, migration간의 의존도와 적용(migrate)순서가 뒤바뀐 것이 원인임을 알 수 있었다. 따라서 DB를 삭제하고 다시 migrate하여보니 오류없이 잘 적용되었다.

 

3.  primary key 지정과 id

유저 모델을 계획하실때 id와 username을 둘다 pk키로 두었었고, 이를 구현하기위해 다음과 같이 username에 primary_key 옵션을 주었다.

class User(AbstractBaseUser):
(중략)
    username = models.CharField(max_length=32, unique=True, primary_key=True)

 

그런데 token 인증을 적용하자, token을 발급할 수 없다는 오류가 발생하였다.

 

공식문서를 참조하자 원인은 다음과 같았다.

Django에서 primary_key는 오직 하나만 존재한다. 그리고 따로 지정하지 않을 경우 id 필드가 자동생성되어 pk역할을 한다.

그러나 primary_key를 지정할 경우, id 필드는 생성되지 않는다.

기본 Token 클래스의 경우, 이 id를 참조하여 토큰을 발급하므로, 위와같이 primary_key를 지정하면 작동하지 않는 것이다.

id는 이외에도 사용될 여지가 크므로 우리는 id를 pk로 두고, username은 단순히 unique한 속성을 가진 한 필드로 두기로 했다.

 

 

 

레퍼런스

https://django.readthedocs.io/en/stable/faq/models.html

 

FAQ: Databases and models — Django 4.2.1 documentation

How do I add database-specific options to my CREATE TABLE statements, such as specifying MyISAM as the table type? We try to avoid adding special cases in the Django code to accommodate all the database-specific options such as table type, etc. If you’d

django.readthedocs.io

 

'TIL' 카테고리의 다른 글

23.05.11 TIL  (0) 2023.05.12
23.05.10 TIL  (0) 2023.05.11
23.05.02 TIL  (0) 2023.05.03
23.05.01 TIL  (0) 2023.05.01
23.04.28 TIL  (0) 2023.05.01