django-rest-api로 프로젝트를 진행하며 커스텀 유저 모델을 생성하고

rest_auth 라이브러리를 이용하여, 로그인과 회원가입, 로그아웃 과정을 진행하려는 참에 token 인증 관련하여 생긴 에러였다.

 

Django custom user token 이라는 검색어로 구글링을 시도하였고, 

겨우겨우 해결책을 찾았다.

 


 

해결책은 다음과 같다.

settings.py에 아래 코드를 추가해주면 오류가 뜨지 않고, 회원가입 시에 token key값이 반환되고, 로그인 시에도 해당 token key 값을 확인할 수 있다. 

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
    ],
}

 

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

 

django에서 기본으로 제공하는 user model을 쓰지 않고

커스텀 유저 모델을 설정하는 과정에서 생긴 문제였는데, 조금 헤맸다. 

 

stackoverflow를 뒤져보니

settings.py의 'django.contrib.admin' 와
urls.py의 path('admin/', admin.site.urls) 을 주석처리하고 makemigrations 및 migrate를 해주면 된다고 적혀있는데..

해보니까 역시나 잘 안된다.

 


 

해결법은

1. 해당 user model을 설정한 app의 migrations 폴더를 지우고,

2. db.sqlite3 파일 삭제

3. python manage.py makemigrations <app 이름>
4. python manage.py migrate <app 이름>

5. python manage.py createsuperuser

 

위 순서대로 실행하니, 의존성 문제 없이 잘 실행된다.

상황을 설명하자면,

 

ec2 인스턴스(ubuntu 16.04 LTS) 위에서 돌리고 있는 서버에서 git push한 저장소를 

windows 환경에서 git pull로 가져와서 수정하려다가 난 에러이다.

 

pip install -r requirements.txt  명령어를 이용하여 가상환경에 필요한 dependency들을 설치하려고 했는데, 

 

No matching distribution found for pkg-resources==0.0.0

 

이러한 에러 메세지가 뜨면서 설치가 되지 않는 것이었다.

 


문제는 ubutu 16.04 LTS과 windows과의 호환성 문제에 있는 것이었다.

 

해결책은 단순히 requirements.txt 를 켜서 해당 line을 삭제하고

다시 pip install -r requirements.txt 명령어를 터미널에 치면 된다.

AWS EC2 시작

 

1.

https://aws.amazon.com/ko/에서 AWS에 가입한다.

12개월 동안 프리티어(지정된 한도 내에서 무료)로 AWS 서비스를 사용 가능하기 때문에 안심하고 가입해도 된다.

 

2.

로그인 후에 상단 <서비스> 탭에서 EC2를 클릭하여 EC2 대쉬보드로 들어간다.

그리고 왼쪽 네비게이션 바에서 [네트워크 및 보안] - [키 페어]를 누르고, 키 페어를 생성한다. 

키 페어가 생성되면 꼭 [키 페어 다운로드] 를 눌러 컴퓨터에 저장해놓자. 인스턴스 접속 단계에서 필요하다.

 

3.

<인스턴스 시작> 버튼을 눌러서 새로운 인스턴스를 시작한다. 

 

프리티어로 Ubuntu 18.04과 16.04 버전이 있는데, 낮은 버전으로 사용해보니까 가상환경 설정 등에서 귀찮은 부분이 생기긴 하더라.

그러한 이유로 18.04 버전을 추천하지만, 최근에 실습해본 것은 16.04 버전이므로 이것으로 설명을 진행하겠다.

추후 18.04 버전으로 실습을 진행하고, 해당 내용에 대해서 추가하도록 하겠다.

 

4. 

[검토 및 시작] 버튼을 눌러 [단계 7: 인스턴스 시작 검토] 로 넘어간다.

<시작> 버튼을 눌러 키페어를 선택하고, <인스턴스 시작 버튼> 클릭

 

여기까지 진행하면 인스턴스가 생성되었을 것이다.

 

인스턴스 접속

 

윈도우 기준으로 설명하겠다. Linux나 Mac 같은 경우는 ssh를 사용해서 접속하더라.

윈도우는 putty를 이용해서 접속하는 것이 편하다.

 

1.

https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

위 링크에서 putty를 다운로드 받을 수 있을 것이다. 

 

2.

다운 받고 나서, puttygen.exe를 먼저 실행해준다.

 

Load를 클릭하고, 위 단계에서 다운로드 했던 키페어 파일을 선택한다.

[Save private key]를 클릭하고 [Yes] 클릭하고 .ppk 파일을 저장해준다.

 

3. 

putty.exe 를 실행하고, EC2 사이트에서 Public DNS 를 복사하여 Host Name에 붙여넣기 한다.

Host Name 앞에 ubuntu@ 를 적어준다.

 

왼쪽 tab에서 Connection - SHH - Auth 클릭 후 , [Browse] 클릭하고, 아까 저장했던 .ppk 파일을 등록한다.

 

Session 탭으로 다시 돌아가서 추후에도 접근이 쉽도록 Saved Session에 이름 작성하고 Save 버튼 눌러서 session 저장해놓자. 

 

[Open] 버튼 눌르면 경고창이 뜨는데 [Yes] 클릭

 

login as: 라는 화면이 뜰 것이다.

ubuntu 라고 입력하면 AWS EC2에 접속이 완료될 것이다.

 

 

여기까지 EC2 인스턴스 생성 및 접속이 완료되었다!!

 

 

django로 만든 웹크롤링 사이트를 iframe 태그로 다른 html에 뿌려줘야하는 상황이 있었다.

 

그냥 iframe 태그로 뿌리니까 해당 사이트에서 연결이 거부되는 문제가 있었다.

아래 방법으로 해결하였다. 적용은 AWS EC2 등 다른 서버에서도 동일하다.


 

해결책은

 

from django.http import HttpResponse
from django.views.decorators.clickjacking import xframe_options_exempt

@xframe_options_exempt
def ok_to_load_in_a_frame(request):
    return HttpResponse("This page is safe to load in a frame on any site.")

이처럼 decorator를 사용하면 가장 간단히 해결할 수 있다.

 

다른 방법도 있는데 middleware를 사용하는 것이다.

setting.py에 아래 코드를 추가해주면 된다.

MIDDLEWARE = [
    ...
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ...
]

X_FRAME_OPTIONS = 'DENY'

 

 

참고문서 : https://docs.djangoproject.com/en/1.10/ref/clickjacking/#how-to-use-it

+ Recent posts