๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ’ก์›น ํ”„๋กœ์ ํŠธ/(๋ฐฑ์—”๋“œ)Django - ํ”„๋กœ์ ํŠธ01

ํ”„๋กœ์ ํŠธ01. Cloud ์„œ๋ฒ„(PythonAnywhere)๋กœ Django ๋ฐฐํฌํ•˜๊ธฐ

์›น์‚ฌ์ดํŠธ๋ฅผ ๊ฐœ๋ฐœํ•œ ํ›„์— ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์˜คํ”ˆํ•˜๋ ค๋ฉด, ์šด์˜ ์„œ๋ฒ„๋ฅผ ์ค€๋น„ํ•˜๊ณ  ๊ฐœ๋ฐœํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๋ฐฐํฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ฃผ๋ณ€์— ์„œ๋ฒ„ H/W๊ฐ€ ์žˆ๋‹ค๋ฉด ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ณ , ๋งŒ์ผ ์—†๋‹ค๋ฉด ํด๋ผ์šฐ๋“œ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ํด๋ผ์šฐ๋“œ ์„œ๋ฒ„ ์ค‘ ๋ฌด๋ฃŒ์ด๋ฉด์„œ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ์‰ฌ์šด PythonAnywhere๋ฅผ ์ด์šฉํ•ด ๋ฐฐํฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

(ํด๋ผ์šฐ๋“œ ์„œ๋ฒ„์—๋Š” AWS, Digital Ocean, Heroku, PythonAnywhere ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.)

 

<PythonAnywhere๋กœ Django ๋ฐฐํฌํ•˜๊ธฐ>

1. PythonAnywhere์— ๋ฌด๋ฃŒ(Beginner : Free!)๊ณ„์ • ๊ฐ€์ž…

  • Username์œผ๋กœ ๋„๋ฉ”์ธ๋ช…์ด ๊ฒฐ์ •๋˜๋ฏ€๋กœ ์œ ์˜!!
  • ๊ณ„์ • ์ƒ์„ฑ ์ ˆ์ฐจ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ Dashboardํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚œ๋‹ค.

 

 

2. Djangoํ”„๋กœ์ ํŠธ์˜ settings.pyํŒŒ์ผ ์„ค์ • ๋ณ€๊ฒฝ

(์œ„์˜ ๋‚ด์šฉ ๋™์ผ)

ALLOWED_HOSTS = [
    '์œ ์ €๋„ค์ž„.pythonanywhere.com'  #์ถ”๊ฐ€
]

(์ค‘๊ฐ„ ๋‚ด์šฉ ๋™์ผ)

STATIC_URL = '/static/'  
STATIC_ROOT = os.path.join(BASE_DIR, 'www_dir', 'static')  #์ถ”๊ฐ€

(์•„๋ž˜ ๋‚ด์šฉ ๋™์ผ)

 

 

3. Django ์†Œ์Šค ๊ฐ€์ ธ์˜ค๊ธฐ

3-1) github์— ์žˆ๋Š” Django์†Œ์Šค cloneํ•˜๊ธฐ(๋‚ด๊ฐ€ ์„ ํƒํ•œ ๋ฐฉ๋ฒ•)

  • ์•„๋ž˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•ด github์— ์žˆ๋Š” ์†Œ์Šค๋ฅผ cloneํ•œ๋‹ค.
#ํ”„๋กœ์ ํŠธ ์†Œ์Šค clone
git clone https://github.com/seunghyun1003/web1.git
cd web1

#๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ณ  migration์„ ์ ์šฉ
python manage.py makemigrations
python manage.py migrate

#์•„๋ž˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ํ”„๋กœ์ ํŠธ ๋‚ด์˜ ์ •์  ํŒŒ์ผ๋“ค์„ ์œ„์—์„œ ์ง€์ •ํ•ด์ค€ STATIC_ROOT ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋ชจ์•„์„œ 
#์‹ค์ œ ์›น ์„œ๋น„์Šค๊ฐ€ ๊ฐ€๋™๋  ๋•Œ ์ด๊ณณ์—์„œ ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค€๋‹ค.
python manage.py collectstatic

 

3-2) Django ํŒŒ์ผ ์••์ถ•ํ•ด ์—…๋กœ๋“œ ํ•˜๊ธฐ

  • PythonAnywhere์—๋Š” ํŒŒ์ผ ์—…๋กœ๋“œ ๊ธฐ๋Šฅ์ด ์žˆ์–ด, ์„œ๋ฒ„์— ์—…๋กœ๋“œ ์ „์— Django์†Œ์Šค๋ฅผ ๋ฏธ๋ฆฌ zipํŒŒ์ผ๋กœ ์••์ถ•ํ•œ๋‹ค.
  • ์••์ถ•ํ•œ ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด PythonAnywhere ์„œ๋ฒ„์—์„œ [Files]๋ฉ”๋‰ด๋กœ ์ด๋™ํ•œ๋‹ค.
  • ์™ผ์ชฝ ๋ถ€๋ถ„์„ ๋ณด๋ฉด, Directories์•„๋ž˜์— ํ™ˆํ™”๋ฉด ํ•˜์œ„์— ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์˜์—ญ์ด ์žˆ๋‹ค. ์ด ๋ถ€๋ถ„์— ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•  ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ , ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•œ๋‹ค.
  • ๋ฆฌ๋ˆ…์Šค ๋ช…๋ น์œผ๋กœ ์••์ถ• ํ’€๊ธฐ : PythonAnywhere์˜ [Consoles]๋ฉ”๋‰ด๋ฅผ ํด๋ฆญํ•œ๋‹ค. "Start a new console" ๋ถ€๋ถ„ ์•„๋ž˜์— "Bash"๋ฅผ ํด๋ฆญํ•˜๋ฉด ์•„๋ž˜ํ™”๋ฉด๊ณผ ๊ฐ™์€ ํ„ฐ๋ฏธ๋„์ฐฝ์ด ๋‚˜ํƒ€๋‚œ๋‹ค. ํ„ฐ๋ฏธ๋„์ฐฝ์— ์•„๋ž˜์™€ ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด ์••์ถ•ํ•œ ํŒŒ์ผ์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

  • ์•„๋ž˜ ๋ช…๋ น์œผ๋กœ ์••์ถ•ํŒŒ์ผ์„ ํ’€์–ด Django ch7ํ”„๋กœ์ ํŠธ์˜ ๋””๋ ‰ํ† ๋ฆฌ ๋ฐ ํŒŒ์ผ๋“ค์„ ๊ตฌ์„ฑํ•œ๋‹ค.
# ์••์ถ•ํ•œ ํŒŒ์ผ์ด ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ๋ช…๋ น์‹คํ–‰

$ unzip ์••์ถ•ํ•œํŒŒ์ผ.zip
$ tree -L 2

 

 

 

4. ๊ฐ€์ƒํ™˜๊ฒฝ ๋งŒ๋“ค๊ธฐ (์™œ? PythonAnywhere์„œ๋ฒ„์—์„œ ํŒŒ์ด์ฌ 3.6์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด)

  • ์•„๋ž˜ ๋ช…๋ น์œผ๋กœ ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค๊ณ , ๊ทธ ๊ฐ€์ƒ ํ™˜๊ฒฝ์œผ๋กœ ์ง„์ž…ํ•œ๋‹ค.(๋‚ด๊ฐ€ ์„ค์ •ํ•œ ๊ฐ€์ƒํ™˜๊ฒฝ ์ด๋ฆ„ : v3PyBook)
# ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ๋ชจ์•„๋‘˜ ๋””๋ ‰ํ† ๋ฆฌ VENV๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค
$ cd ~
$ mkdir VENV
$ cd VENV

# ํŒŒ์ด์ฌ 3.6์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์ƒ ํ™˜๊ฒฝ v3PyBook์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค
$ virtualenv --python python3.6 v3PyBook

# v3PyBook ๊ฐ€์ƒ ํ™˜๊ฒฝ ์•ˆ์œผ๋กœ ์ง„์ž…ํ•ฉ๋‹ˆ๋‹ค
$ source ~/VENV/v3PyBook/bin/activate

# ๊ฐ€์ƒ ํ™˜๊ฒฝ ๋‚ด์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด ํ”„๋กฌํ”„ํŠธ์— (v3PyBook)์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค
# ๊ฐ€์ƒ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํŒŒ์ด์ฌ ๋ฒ„์ „์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค
(v3PyBook) $ python –V 

# ๊ฐ€์ƒ ํ™˜๊ฒฝ์—์„œ ๋น ์ ธ๋‚˜์˜ค๋Š” ๋ช…๋ น์ž…๋‹ˆ๋‹ค
# ์ด ๋ช…๋ น์ด ์‹คํ–‰๋˜๋ฉด ํ”„๋กฌํ”„ํŠธ๊ฐ€ ๋ฐ”๋€Œ๋ฉด์„œ ๊ฐ€์ƒ ํ™˜๊ฒฝ ๋ฐ–์— ์žˆ์Œ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค(v3PyBook) 
$ deactivate
  • ์ดํ›„์˜ ์ž‘์—…์€ ๋ชจ๋‘ ๊ฐ€์ƒํ™˜๊ฒฝ ๋‚ด์—์„œ ์‹คํ–‰ํ•œ๋‹ค. ์žฅ๊ณ  ํ”„๋กœ๊ทธ๋žจ๋„ ํŒŒ์ด์ฌ์˜ ๊ธฐ๋ณธ ํŒจํ‚ค์ง€๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๊ฐ€์ƒํ™˜๊ฒฝ ๋‚ด์— ์„ค์น˜ํ•ด์•ผํ•œ๋‹ค. ์•„๋ž˜ ๋ช…๋ น์„ ์ž…๋ ฅํ•ด ์žฅ๊ณ ๋ฅผ ์„ค์น˜ํ•ด์ค€๋‹ค.
# v3PyBook ๊ฐ€์ƒ ํ™˜๊ฒฝ์œผ๋กœ ์ง„์ž…ํ•ฉ๋‹ˆ๋‹ค
$ source ~/VENV/v3PyBook/bin/activate

# ์žฅ๊ณ  2.0 ๋ฒ„์ „์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค
(v3PyBook) $ pip install Django==2.0

# v3PyBook ๊ฐ€์ƒ ํ™˜๊ฒฝ์— ์„ค์น˜๋œ ํŒจํ‚ค์ง€ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค
(v3PyBook) $ pip list

 

 

5. PythonAnywhere์›น ์„œ๋ฒ„ ์„ค์ •ํ•˜๊ธฐ : ์›น ์„œ๋ฒ„๊ฐ€ Djangoํ”„๋กœ๊ทธ๋žจ์„ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋„๋ก ์›น์„œ๋ฒ„์˜ ์„ค์ •์„ ๋ณ€๊ฒฝํ•ด์•ผํ•จ.

  • ์›น ์„œ๋ฒ„ ๋งˆ๋ฒ•์‚ฌ ์„ค์ • ์‚ฌํ•ญ
๋”๋ณด๊ธฐ
  1. PythonAnywhere์˜ [Web]๋ฉ”๋‰ด๋ฅผ ํด๋ฆญํ•˜๊ณ , "Add a new web app"๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์„ค์ • ๋งˆ๋ฒ•์‚ฌ๊ฐ€ ์‹œ์ž‘๋œ๋‹ค.
  2. "Your web app's domain name" : ๋„๋ฉ”์ธ๋ช…์„ ์•Œ๋ ค์ฃผ๋Š” ํŒ์—…์ด ๋œจ๋ฉด [Next]๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ๋‹ค. 
  3. "Select a Python Web framework" : ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ Django๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š๊ณ , [Manual configuration]์„ ์„ ํƒํ•œ๋‹ค. ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ์‹ ๊ทœ Djangoํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์—๋งŒ [Django]๋ฅผ ์„ ํƒํ•œ๋‹ค.
  4. "Select a Python version" : ๊ฐ€์ƒํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ„์ „๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ฒ„์ „์œผ๋กœ ์„ ํƒํ•œ๋‹ค. [Next]๋ฅผ ํด๋ฆญํ•˜๋ฉด ๋งˆ๋ฒ•์‚ฌ๊ฐ€ ์ข…๋ฃŒ๋œ๋‹ค.
  5. ์„ค์ • ๋งˆ๋ฒ•์‚ฌ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚œ๋‹ค. ๋ฌด๋ฃŒ ๊ณ„์ •์ด๋ฏ€๋กœ 3๊ฐœ์›”๋งˆ๋‹ค ์—ฐ์žฅํ•ด์ค˜์•ผ ํ•œ๋‹ค.
  • ๊ฐœ๋ฐœํ•œ Django ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์„ค์ • ๋งˆ๋ฒ•์‚ฌ์— ์˜ํ•ด ๋“ฑ๋ก๋œ ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•ด์•ผํ•œ๋‹ค.

  โ‘  [Code]์„น์…˜์˜ Source code์„ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ๋กœ ์ž…๋ ฅํ•ด์ฃผ๊ณ , WSGI configuration file์„ ์•„๋ž˜์˜ ์ฝ”๋“œ๋กœ ์ˆ˜์ •ํ•œ๋‹ค.

# ๊ธฐ์กด์˜ ๋‚ด์šฉ์„ ๋ชจ๋‘ ์ง€์šฐ๊ณ  ์•„๋ž˜ ๋‚ด์šฉ์œผ๋กœ ์ž‘์„ฑ ํ›„, [Save]๋ฒ„ํŠผ ํด๋ฆญ

import os
import sys

# ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ(๋ฒ ์ด์Šค) ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค
path = 'ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ'
if path not in sys.path:
    sys.path.append(path)

os.environ['DJANGO_SETTINGS_MODULE'] = 'settings.pyํŒŒ์ผ์ด ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์ด๋ฆ„.settings'

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

  โ‘ก [Virtualenv]์„น์…˜์— ์œ„์—์„œ ๋งŒ๋“  ๊ฐ€์ƒํ™˜๊ฒฝ์„ ๋“ฑ๋กํ•œ๋‹ค.

  โ‘ข [Static files]์„น์…˜์— settings.py ํŒŒ์ผ์— ์ •์˜๋œ ๋‚ด์šฉ์„ ๊ทธ๋Œ€๋กœ ๊ธฐ์ž…ํ•œ๋‹ค.(URL์—๋Š” STATIC_URL์„ค์ • ํ•ญ๋ชฉ์˜ ๊ฐ’์„ ๋“ฑ๋กํ•˜๊ณ , Directory์—๋Š” STATIC_ROOT์„ค์ • ํ•ญ๋ชฉ์˜ ๊ฐ’์„ ๋“ฑ๋กํ•œ๋‹ค.)

  • ๋ชจ๋“  ์„ค์ •์„ ์™„๋ฃŒํ•˜์˜€์œผ๋ฉด PythonAnywhere์˜ [Web]๋ฉ”๋‰ด๋กœ ์ด๋™ํ•ด ํ™”๋ฉด ์ƒ๋‹จ์˜ ์ดˆ๋ก์ƒ‰ "Reload"๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ, ์ƒˆ๋กœ์šด ์„ค์ •์œผ๋กœ PythonAnywhere ์›น ์„œ๋ฒ„๋ฅผ ์žฌ์‹œ์ž‘ํ•œ๋‹ค.

 

 

6. ์ง€๊ธˆ๊นŒ์ง€ ์ž‘์—… ํ™•์ธํ•˜๊ธฐ

http://์œ ์ €๋„ค์ž„.pythonanywhere.com

(๋‚ด ๊ฒฝ์šฐ : http://jsh.pythonanywhere.com)