[Django] Django로 만든 앱을 배포하기: Pythonanywhere

2023. 1. 31. 01:31Back-end/Django

반응형

서론

개발한 앱을 PC에서 작동시킬수도 있지만, 만약 이 앱이 24시간 365일 작동해야 한다면 컴퓨터의 전원이 절대로 꺼지면 안될 것입니다. 또한 앱의 이용자가 기하급수적으로 늘어나면 컴퓨터의 CPU, 램, 저장장치 등을 추가해야 할 수도 있습니다. 이러한 환경을 개인이 구축하기에는 다소 힘들기 때문에, 앱을 제 3자에게 제공하여 사람들이 언제든지 자유롭게 앱을 사용할 수 있도록 배포할 수도 있습니다.

 

 

Django 앱을 배포하는 방법은 다음과 같습니다.

 

1. AWS로 배포하기

: EC2 인스턴스로 배포할 수 있습니다. 또한 Django 앱을 Gunicorn(WSGI)과 연결하고 웹서버인 Nginx를 또 연결해야 합니다.

 

2. Pythonanywhere로 배포하기

: 소규모 앱에 적합하며 무료입니다. 배포과정도 AWS에 비하면 간단한 편입니다.

 

이 문서에서는 Pythonanywhere로 Django 앱을 배포하는 방법에 대해 설명합니다.


1. Django 앱의 시크릿 키 분리하기

 

시크릿 키는 Django 프로젝트마다 부여된 고유한 키입니다. 이 키가 노출되면 다른사람이 악용할 수 있기 때문에 앱을 배포한다면 키를 분리하는 과정을 꼭 거쳐야 합니다.

 

1) 프로젝트 폴더 > settings.py 에서 "SECRET_KEY" 부분을 삭제하고, 외부의 secrets.json 파일을 생성하여 여기에 붙여넣습니다.

2) 프로젝트 폴더 > settings.py 에 외부의 json 파일로 시크릿 키를 읽어오는 코드를 추가합니다.

import json
from pathlib import Path
import os
from pathlib import Path
from django.core.exceptions import ImproperlyConfigured

secret_file = os.path.join(BASE_DIR, 'secrets.json')

with open(secret_file) as f:
    secrets = json.loads(f.read())


def get_secret(setting, secrets=secrets):
    try:
        return secrets[setting]
    except KeyError:
        error_msg = "Set the {} environment variable".format(setting)
        raise ImproperlyConfigured(error_msg)

 

3) Django 프로젝트를 github에 업로드할 때, 시크릿 키가 들어있는 secrets.json 파일이 같이 업로드 되는것을 방지하기 위해 .gitignore에 secrets.json을 추가합니다.

...
### Django ###
...

secrets.json
...

 

 

 

2. Github에 프로젝트 업로드하기

1) 프로젝트 폴더 > settings.py에서 다음을 수정합니다. 배포단계이기 때문에 앱이 Debug 모드로 실행되지 않도록 합니다. 또한 CORS 정책에 의해 다른 앱과 통신하지 못하는 상황을 방지하기 위해, ALLOWED_HOST를 수정해야 합니다.

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

ALLOWED_HOSTS = ['*', '.pythonanywhere.com']
...

 

2) 터미널에서 다음을 실행하여 정적 파일들을 모아야 합니다. Django에서는 자바 스크립트, CSS, 이미지 파일 등을 정적 파일이라고 부릅니다. Django는 배포 단계에서 정적 파일을 모아서 웹서버에 전달해줄 뿐이고, 웹서버가 이 정적 파일을 저장한 뒤 클라이언트에 응답하게 됩니다.

$ python manage.py collectstatic

 

3) github에 프로젝트를 업로드합니다. 이 단계에서 시크릿 키가 들어있는 secret.json 파일은 업로드되지 않아야 합니다.

 

 

 

3. Pythonanywhere에서 Github 프로젝트를 설정합니다.

1) Pythonanywhere에 가입하고, 대시보드 페이지에서 $Bash를 눌러서 콘솔을 생성합니다.

2) 터미널에서 Django 프로젝트를 clone합니다.

$ git clone https://github.com/아이디/Django프로젝트.git

 

3) secret.json 파일을 프로젝트 폴더에 업로드 합니다.

 

4) 가상환경을 설치합니다.

$ virtualenv --python=python3.9 venv
$ source venv/bin/activate

 

5) Django를 설치합니다.

$ pip install django

 

6) 마이그레이션 및 슈퍼유저를 생성합니다.

$ python manage.py makemigrations
$ python manage.py migrate
$ python manage.py createsuperuser

 

7) Web 탭에서 다음을 설정합니다.

- Working directory: 프로젝트 폴더의 경로입니다. 이 폴더에는 manage.py가 있어야 합니다.

- WSGI configuration file: path와 os.envrion을 설정합니다.

- Virtualenv: 가상환경 venv 폴더의 경로를 설정합니다.

- Static files: static, media 폴더의 경로를 설정합니다.

 

# This file contains the WSGI configuration required to serve up your
# web application at http://codenamenam.pythonanywhere.com/
# It works by setting the variable 'application' to a WSGI handler of some
# description.
#
# The below has been auto-generated for your Django project

import os
import sys

path = '/home/github 이름/manage.py가 있는 폴더 이름'
if path not in sys.path:
    sys.path.append(path)


# set environment variable to tell django where your settings.py is
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings.py가 있는 폴더 이름.settings'


# serve django via WSGI
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

 

8) 초록색의 Reload 버튼을 누른 뒤, 자신의 pythonanywhere 주소에 접속해서 페이지가 잘 나오는지 확인합니다.

반응형