컴퓨터/WEB

[Django] PythonAnywhere로 Django 프로젝트 배포하기

정석이 2022. 5. 1. 01:43

 

Django 배포 (Deployment)

 

디버그 모드 (Debug Mode)

 

디버그 모드는 에러가 발생했을 때 자세한 에러 페이지를 표시한 것이다.

 

 

 

 

 

기본적으로 Django 프로젝트를 생성하면 settings.py에 디버그 모드가 켜져 있는 상태로 만들어진다.

 

 

# settings.py

...
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
...

 

 

디버그 모드가 켜져 있으면 웹 브라우저에 우리 프로젝트에 대한 자세한 로그를 보여 주는데 개발 중에는 에러가 발생했을 때 쉽게 수정할 수 있게 도와주는 기능이지만

 

 

배포 시에는 이와 같은 자세한 로그가 프로젝트의 소스 코드와 여러 설정 값을 노출해서 보안 이슈로 이어지기 때문에 꼭 디버그 모드를 꺼주어야 한다.

 

 

그리고 디버그 모드를 끄게 되면 실제로 ALLOWED_HOSTS에 있는 호스트(hosts) 외에는 접속이 차단 되어 더이상 내 컴퓨터에서도 접속이 되지 않는다.

 

 

그래서 DEBUG 모드를 끄게 되면 호스트를 꼭 적어줘야 한다.

 

 

 

 

settings.py

 

 

 

호스트 설정 (Allowed Hosts)

 

 

호스트(Host)란 쉽게 말하면 네트워크상의 컴퓨터를 말한다.

 

요청하는 호스트가 바로 클라이언트고 요청에 대해 응답을 하는 호스트가 서버이다.

 

 

우리가 ALLOWED_HOSTS에 적는 호스트는 우리가 만든 Django 프로젝트로 들어오는 요청에 대해 응답을 할 수 있는 호스트 즉, 서버의 주소를 적어 주는 것이다.

 

 

처음에는 이렇게 비어있는 상태로 생성된다.

 

 

# settings.py

...
ALLOWED_HOSTS = []
...

 

 

이렇게 비어있는 호스트이면서 디버그 모드가 켜져 있는 경우에는 [ 'localhost', '127.0.0.1', '[::1]' ]과 같은 의미가 되어

 

로컬 호스트(localhost).. 즉 내 컴퓨터에서 접속이 가능한 상태가 된다.

 

 

그런데 디버그 모드를 끄게 되면 ALLOWED_HOSTS에 적혀있는 호스트 외에는 일체 접속이 차단되기 때문에 심지어 내 컴퓨터에서도 접속이 안됨!

 

 

그래서 우리가 배포할 서버와 내 컴퓨터에 대해 허용해주기 위해 ALLOWED_HOSTS 리스트에 호스트를 추가해주는 것이 필요하다.

 

 

 

settings.py

 

 

우리는 pythonanywhere를 사용할 것이기 때문에 '.pythonanywhere.com' 을 넣어줄 것이다.

 

 

 

 

 

정적 파일 관리 (Static Files)

 

 

프로젝트를 개발할 때는 각 앱 별로 정적 파일을 위한 디렉토리를 두고 관리하겠지만 배포 후 실 서버에서는 정적 파일을 하나의 경로 안에 두고 사용하게 된다.

 

 

그래서 흩어져있는 정적 파일들을 하나의 경로로 모두 모아 주어야 한다.

 

 

settings.py에 STATIC_URL이라는게 있는데  얘는 프로젝트 내부를 기준으로 한 정적파일 경로이고

 

 

그 밑에 STATIC_ROOT라는 것을 만들 것이다.

 

 

여기가 실제로 정적 파일이 모아지는 경로이고, 장고 프로젝트에서 사용하는 모든 정적 파일이 이 경로에 복사된다.

 

 

settings.py

 

 

 STATIC_ROOT = os.path.join(BASE_DIR, 'static') 라고 적어줄 것이다.

 

 

이건 base 아래에 static이라는 정적 파일을 두고 그곳에 모든 정적 파일을 두겠다고 명시해준 것이다.

 

 

이제 정적 파일을 한곳에 모아야 하는데 

 

 

이 때 collectstatic 라는 명령어를 사용하면 흩어져 있는 정적 파일을 settings.py에 명시되어 있는 STATIC_ROOT 경로로 복사해서 모아 준다.

 

 

 

 

모아주라

 

 

 

이제 프로젝트 디렉토리 아래를 보면 static이라는 폴더가 생성되어 있고 안에 이쁘게 정리되어 있다.

 

 

프로젝트 디렉토리 안에 생긴 static 폴더

 

 

 

여기서 admin은 장고에서 기본적으로 제공하는 관리자 앱에 대한 정적 파일이다.

 

 

 

 

STATIC_URL과 STATIC_ROOT의 차이

 

 

STATIC_URL은 실제 존재하는 경로가 아니라 웹 페이지에서 사용할 정적 파일에 대한 URL이다.

 

쉽게 말해서 정적 파일들에 붙여 놓는 하나의 태그 같은.. 느낌이다.

 

 

예를 들어 STATIC_URL='/static_files/' 라고 하면 정적 파일에 대한 URL은~/static_files/정적 파일의 형태로 할당이 된다.

 

 

반면에 STATIC_ROOT는 실제 존재하는 경로로 Django 프로젝트에서 사용하는 모든 정적 파일이 이 경로에 존재하고

 

 

웹 서버가 정적 파일을 찾기 위해 참조하는 실제 경로이다.

 

 

 

 

 

프로젝트 디렉토리 전체 압축

 

 

압축해

 

압축했고 바탕화면에 빼줬다.

 

 

 

 

 

pythonanywhere 접속해서 설정하기

 

 

https://www.pythonanywhere.com/

 

Host, run, and code Python in the cloud: PythonAnywhere

Batteries included With Python versions 2.7, 3.5, 3.6, 3.7 and 3.8, and all the goodies you normally find in a Python installation, PythonAnywhere is also preconfigured with loads of useful libraries, like NumPy, SciPy, Mechanize, BeautifulSoup, pycrypto,

www.pythonanywhere.com

 

 

 

홈페이지로 들어가서 sign up 해준다.

 

 

가입 ㄱㄱ

 

 

 

Files  들어가서 Upload a file 눌러서 아까 만든 zip 파일 업로드한다. 그러고 Open Bash Console here 누르삼

 

 

 

 

 

 

 

들어갔으면 ls로 zip 파일이 있는지 확인하고 unzip 해준다.

 

 

unzip

 

 

이 다음부턴 걍 코드만 쓰겠음..

 

virtualenv --python=python3.7 django-envs
ls 로 django-envs가 있는지 확인
cd django-envs/
source bin/activate
pip install django==2.2

 

파이썬이나 장고 버전은 알아서..

 

 

 

 

 

그러고 오른쪽 삼지창 눌러서 Web 으로 들어간다.

 

맨 밑에꺼 선택

 

 

Add해서.. 여기서 맨 밑에 manual 저거 누르고 파이썬 버전 선택하면 된다.

 

 

 

생성이 되었다면 

 

 

 

Code 부분으로 가서 Source code에 /home/{만든 id}/{프로젝트명} 을 입력해준다.

 

 

나같은 경우 /home/seo/costaurant

 

 

 

그리고 미밑에 WSGI configuration file을 누른다

 

 

주석처리 한다

 

 

 

밑에 DJANGO 부분 주석 해제하고 path 아까 설정한 부분으로 설정해준다.

 

 

 

주석 해제하고 빨간 부분 설정해줌

 

하고 save 해준다.

 

 

 

virtualenv 부분

 

virtualenv 부분에 /home/{id}/{가상환경 이름} 을 넣어준다.

 

 

 

static files

 

Static files에 URL과 Directory 부분을 저런식으로 채워준다.

 

 

 

 

이제 모든 설정이 끝났다~~!

 

 

 

맨 위로 가서 Reload 버튼을 눌러준 후 그 위에 있는 주소로 들어가면 된다.