์น์ฌ์ดํธ๋ฅผ ๊ฐ๋ฐํ ํ์ ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ ์คํํ๋ ค๋ฉด, ์ด์ ์๋ฒ๋ฅผ ์ค๋นํ๊ณ ๊ฐ๋ฐํ ํ๋ก๊ทธ๋จ์ ๋ฐฐํฌํด์ผ ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์ฃผ๋ณ์ ์๋ฒ 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ํ๋ก๊ทธ๋จ์ ์ธ์ํ ์ ์๋๋ก ์น์๋ฒ์ ์ค์ ์ ๋ณ๊ฒฝํด์ผํจ.
- ์น ์๋ฒ ๋ง๋ฒ์ฌ ์ค์ ์ฌํญ
- PythonAnywhere์ [Web]๋ฉ๋ด๋ฅผ ํด๋ฆญํ๊ณ , "Add a new web app"๋ฒํผ์ ํด๋ฆญํ๋ฉด ์ค์ ๋ง๋ฒ์ฌ๊ฐ ์์๋๋ค.
- "Your web app's domain name" : ๋๋ฉ์ธ๋ช ์ ์๋ ค์ฃผ๋ ํ์ ์ด ๋จ๋ฉด [Next]๋ฒํผ์ ํด๋ฆญํ๋ค.
- "Select a Python Web framework" : ๊ฐ์ ํ๊ฒฝ์ ์ฌ์ฉํ๋ฏ๋ก Django๋ฅผ ์ ํํ์ง ์๊ณ , [Manual configuration]์ ์ ํํ๋ค. ๊ฐ์ ํ๊ฒฝ์ ์ฌ์ฉํ์ง ์์ผ๋ฉด์ ์ ๊ท Djangoํ๋ก์ ํธ๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ์๋ง [Django]๋ฅผ ์ ํํ๋ค.
- "Select a Python version" : ๊ฐ์ํ๊ฒฝ์์ ์ฌ์ฉํ๋ ๋ฒ์ ๊ณผ ์ผ์นํ๋ ๋ฒ์ ์ผ๋ก ์ ํํ๋ค. [Next]๋ฅผ ํด๋ฆญํ๋ฉด ๋ง๋ฒ์ฌ๊ฐ ์ข ๋ฃ๋๋ค.
- ์ค์ ๋ง๋ฒ์ฌ๊ฐ ์ข ๋ฃ๋๋ฉด ์๋์ ๊ฐ์ ํ๋ฉด์ด ๋ํ๋๋ค. ๋ฌด๋ฃ ๊ณ์ ์ด๋ฏ๋ก 3๊ฐ์๋ง๋ค ์ฐ์ฅํด์ค์ผ ํ๋ค.
![](https://blog.kakaocdn.net/dn/bOrsdZ/btqBlz1BXbR/MXW8MOw8k4AvJkLWIfsvY0/img.png)
- ๊ฐ๋ฐํ 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) |
'๐ก์น ํ๋ก์ ํธ > (๋ฐฑ์๋)Django - ํ๋ก์ ํธ01' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ๋ก์ ํธ01. Django authentication๋ฅผ ํ์ฉํ ํ์๊ฐ์ , ๋ก๊ทธ์ธ, ๋ก๊ทธ์์ ๊ตฌํ (0) | 2019.12.13 |
---|---|
ํ๋ก์ ํธ01. bootstrap ์ ์ฉํ๊ธฐ (0) | 2019.12.11 |
ํ๋ก์ ํธ01. ํจ์ํ ๋ทฐ์์ ํด๋์คํ ๋ทฐ๋ก ๋ณ๊ฒฝ & detail, update, delete๊ตฌํ (0) | 2019.12.09 |
ํด๋์คํ view (0) | 2019.12.09 |
ํ๋ก์ ํธ01. admin ์ฌ์ดํธ์ model class ๋ฑ๋กํ๊ธฐ (0) | 2019.12.09 |