- ๋๋ถ๋ถ์ ๋ด์ฉ์ Django๋ฌธ์์ ์ฅ๊ณ ๊ฑธ์คํํ ๋ฆฌ์ผ ๋ฅผ ์ฐธ๊ณ ํ์ฌ ์์ฑํฉ๋๋ค.
์๋ฒ์ชฝ์ ๋ Node๋ฅผ ์จ์๋๋ฐ, Django๋ฅผ ์ ๊น ์ธ์ผ์ด ์๊ฒจ ์ฐ๋๊น์ ์ ๋ฆฌํด ๋ก๋๋ค.
- [5/19์ผ] Django ๊ฐ๋ ๊ณผ ๊ธฐ๋ณธ์ ํ ๋ฐ ์๋ฒ์คํ
- [5/20์ผ] Django ๋ชจ๋ธ๋ง
python์ผ๋ก ๋ง๋ค์ด์ง ๋ฌด๋ฃ ์ดํ๋ฆฌ์ผ์ด์ ํ๋ ์์ํฌ ์ ๋๋ค. ์ฅ์ ์ผ๋ก๋ ์ด๋ณด์ ๋ถ๋ค์ด ๋ฐฐ์ฐ๊ธฐ ์ฌ์ด python์ผ๋ก ๋์ด์๋ค๋ ์ ์ด๊ณ , ๋ก๊ทธ์ธ, ํ์๊ฐ์ , ์ธ์ฆ,cors๋ฑ์ ๋ฐ๋ณต์ ์ผ๋ก ๊ตฌํํด์ผ ํ๋ ๋ถ๋ถ์ ์ด๋ฏธ ๋ง๋ค์ด์ก๋ค ๋ผ๋ ์ ์์ ๊ฐ๋ฐ ์๊ฐ์ ๋จ์ถ ์ํฌ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
๋ณดํต MVC ํจํด์ ๋ง์ด ์ฌ์ฉํฉ๋๋ค.(ํนํ ๋ํ์ ์ผ๋ก spring) ํ์ง๋ง Django๋ MVT(mobile-view-templates) ๊ธฐ๋ฐ ์ ๋๋ค.
์ฅ๊ณ ๋ ๊ฐ์ํ๊ฒฝ์ ์ค์นํด์ ๋ ๋ฆฝ์ ํ๊ฒฝ์์ ๊ฐ๋ฐํฉ๋๋ค. ๊ฐ์ ๋ ์๋๋๋ค. ํ์ง๋ง ๊ฐ์ํ๊ฒฝ์์ ๊ฐ๋ฐ์ ์ ๊ทน ๊ถํฉ๋๋ค. ์? ๊ฐ์ํ๊ฒฝ์์ ์ค์นํด์ผ ํ๋? ์ ์ญ์ ์ธ ๊ณต๊ฐ์ ์ค์นํด ๊ฐ๋ฐ์ ์งํ ํ ๊ฒฝ์ฐ ํ ์ปดํจํฐ์์ ํ๋์ ์ฅ๊ณ ๋ฒ์ ๋ง์ ์ฌ์ฉํ ์ ์์ต๋๋ค. a๋ฒ์ ์์ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ค๊ฐ ๋ค๋ฅธ ํ๋ก์ ํธ์์ c๋ฒ์ ์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ค๋ฉด ํ ์ปดํจํฐ์์ ํ๋์ ์ฅ๊ณ ๋ฒ์ ๋ง์ ์ฌ์ฉํ ์ ์๊ธฐ์ ๋ฒ์ ์ ์ ์์ผ์ผ ํ๋๋ฐ ์ถฉ๋์ด๋๊ฑฐ๋ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ฃ .
CRUD์ ์ง์ค๋์ด์๋ ํ๋ก์ ํธ๋ผ๋ฉด Django ๋ฅผ ์ฌ์ฉํ ๊ฒ ๊ฐ๊ณ , ์ปค์คํฐ๋ง์ด์ง์ด ๋ง์ด ํ์ํ๋ค๋ฉด, Node.js๋ฅผ ์ ํ ํ ๊ฒ ๊ฐ์๋ฐ, ๊ฐ์ธ์ ์ผ๋ก๋ js๋ฅผ ์ฃผ ์ธ์ด๋ก ์ฐ๋ ์ ์ฅ์์ Node.js๊ฐ ํธํ ๊ฒ ๊ฐ์ต๋๋ค. ์๋๋ฉด์์๋ ๊ทธ๋ ๊ณ ์.
mac os ๊ธฐ์ค prectice_venv ์ด๋ผ๋ ์ด๋ฆ์ ๊ฐ์ํ๊ฒฝ ์ค์น(์ด๋ฆ์ ๋ง์๋๋ก)
python3 -m venv prectice_venv
์ฅ๊ณ ์ค์น (๋น์ฐํ ํ์ด์ฌ์ ์ค์น ๋์ด์๋ค๋ ๊ฐ์ ํ์)
- ๊ฐ์ํ๊ฒฝ ํ์ฑํ
source prectice_venv/bin/activate
- ์ฅ๊ณ ์ค์น
pip install django~=2.0.0
๐ฅ ModuleNotFoundError: No module named 'pip' ๋ผ๊ณ ๋ ์!!! ๐ฅ
๋ง์ฝ ModuleNotFoundError: No module named 'pip' ๋ผ๊ณ ๋ฌ๋ค๋ฉด, ์๋์ ๊ฐ์ด ์ฅ๊ณ ๋ฅผ ์ค์นํ๋๋ฐ ํ์ํ pip๋ฒ์ ์ด ์ต์ ์ธ์ง ํ์ธํ๊ณ install์ ์งํ
python3 -m pip install --upgrade pip
๋ง์ฝ ๊ธฐ์กด์ ์ค์นํ์๋๋ฐ ์๋๋ค๋ฉด ์ ๊ทธ๋ ์ด๋ ํ๊ณ ์ญ์ ํ ์ฌ์ค์น ํ๋ ๊ณผ์ ์์ ๊ถํ ๋ฌธ์ ๋ก pip๊ฐ ์ญ์ ๋ ์ํ๋ก ๋จ์ ์ด๋ฐ ํ์์ด ๋ฐ์ ํ ์ ์์ผ๋ฏ๋ก pypa๋ฅผ ํตํด pip๋ฅผ ์ฌ์ค์น ํด์ค๋๋ค.
//curl์ ์ด์ฉํด ๋ค์ด
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
//์ค์น
python get-pip.py
์ฑ๊ณต์ ์ผ๋ก ๋๋ค๋ฉด?
pip3 -V // ๋ฒ์ ํ์ธ ๋ฒ์ ์ด ์๋จ๋ฉด ์ฑ๊ณต์ ์ผ๋ก ์ค์น ๋๊ฑฐ์
โ๐ป ์๋ ๋ชจ๋ ์ ํ ์ ๋ฐ๋์ ๊ฐ์ํ๊ฒฝ์์ ์งํํด์ฃผ์ธ์!!!
๐บ ๊ฐ์ํ๊ฒฝ ํ์ฑํ ๋ฐฉ๋ฒ (prectice_venv์๋ ์ฌ๋ฌ๋ถ์ด ๋ง๋ ๊ฐ์ํ๊ฒฝ ์ด๋ฆ) mac os (shell์์) - source prectice_venv/bin/activate window (cmd์์) - prectice_venv\Scripts\activat
- mysite ๋ ๊ทธ๋ฅ ์ด๋ฆ์ ์ฌ๋ฌ๋ถ ๋ง์๋๋ก ํ๋ฉด ๋จ
- .์ ํ์ฌ ๋๋ ํ ๋ฆฌ์ ๋ถ๋ฌ์ค๊ฒ ๋ค๋ ์๋ฆฌ
django-admin startproject mysite .
์ฑ๊ณต์ ์ผ๋ก ๋ง๋ค์ด ์ก๋ค๋ฉด ์๋์ ๊ฐ์ ํ์ด์ฌ ํ์ผ์ด ์๊ธธ ๊ฒ๋๋ค. ์ ๋ backํด๋ ์์์ ์์ ์ค์น๋ค์ ๋ชจ๋ ์งํํ์ต๋๋ค.
.
โโโ ๐ back
โโโ ๐ manage.py # Django ํ๋ก์ ํธ์ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์ํธ์์ฉ ํ๋ ์ปค๋งจ๋๋ผ์ธ์ ์ ํธ๋ฆฌํฐ
โ โโโ ๐ __ init __.py
โ โโโ ๐ settings.py # ์น์ฌ์ดํธ ์ค์ ์ด ์๋ ํ์ผ
โ โโโ ๐ asgi.py
โ โโโ ๐ wsgi.py
โ โโโ ๐ urls.py # urlresolver๊ฐ ์ฌ์ฉํ๋ ํ์ผ
โโโ ...
๐ asgi, wsgi ์ ๋ญ๊น?
Django ์น ์ดํ๋ฆฌ์ผ์ด์ ์๋ฒ ์ํคํ ์ณ์์๋ Django ํ๋ ์์ํฌ ๋ด๋ถ์ url๊ณผ web server๊ฐ ํต์ ํฉ๋๋ค.
์ฌ๊ธฐ์ web server๋ก ๋ง์ด ์ฌ์ฉ๋๋ Apach HTTP Server์ Tomcat์ JAVA๊ธฐ๋ฐ์ด๋ฏ๋ก ํ์ด์ฌ ์ฝ๋๋ฅผ ์ฝ์ ์ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ ์ ์๋ ์น์๋ฒ๋ ๋งค์ฐ ํ์ ์ ์ ๋๋ค.
์ฑ๋ฅ๋ฉด์์ ๊ฒ์ฆ๋์ด์๋ apach์ชฝ์ ์น์๋ฒ๋ฅผ ์ด์ฉํ๋ฉด ์ข์๋ฐ,
์ด๋ ์ต์ ์ ์๋ฃจ์ ์ด Apach ์ฌ๋จ์ ์น ์๋ฒ ๋ฟ๋ง ์๋๋ผ ๋ชจ๋ ์น ์๋ฒ์ Python ๊ณ์ด์ ํ๋ ์ ์ํฌ๊ฐ ํต์ ํ ์ ์๊ฒ ํด์ฃผ๋ ๋ฏธ๋ค ์จ์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ ๋ฐ๋ก asgi,wsgi ์ ๋๋ค.
-
asgi๋ web server์ ํ๋ ์์ํฌ(django) ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฐ๊ฒฐํด ์ฃผ๋ python์ ํ์ค api, wsgi์์ ์์ํธํ
-
wsgi๋ ASGI์ด์ ์ Python์ ํ์ค ๋น๋๊ธฐ ๋ฐฉ์ ๊ธฐ๋ฅ์ ๊ตฌํ์ ์์ด์ ๋ฌธ์ ๊ฐ ๋ง์๋ wsgi๋ผ asgi๊ฐ ๋์๋ค.
์์ธํ ์ฌํญ์ ์๋ ๋งํฌ ์ฐธ์กฐ https://nitro04.blogspot.com/2020/01/django-python-asgi-wsgi-analysis-of.html
- mysite/settings.py์ ์กฐ๊ธ ๊ณ ์ณ ๋ณผ๊ฒ์. ์ค์นํ ์ฝ๋ ์๋ํฐ๋ฅผ ์ด์ด ํ์ผ์ ์ด์ด์ฃผ์ธ์
์๊ฐ ๋ฐ๊พธ๊ธฐ
TIME_ZONE = 'UTC' -> TIME_ZONE = 'Asia/Seoul'
์ ์ ํ์ผ ๊ฒฝ๋ก ์ถ๊ฐํ๊ธฐ
STATIC_URL = '/static/' STATIC_ROOT = BASE_DIR, 'static'
ํธ์คํธ์ค์
๋๋ฒ๊น ๋ชจ๋์์ ALLOWED_HOSTS ๋ณ์๊ฐ ๋น ๋ฆฌ์คํธ์ผ ๊ฒฝ์ฐ ['localhost', '127.0.0.1', '[::1]'] ์๋ฏธ๊ฐ ๋ฉ๋๋ค. ์ฆ, ๋ก์ปฌ ํธ์คํธ์์๋ง ์ ์์ด ๊ฐ๋ฅํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ ๋ PythonAnywhere์ ํธ์คํธ ์ด๋ฆ๊ณผ ์ผ์นํ์ง ์์ผ๋ฏ๋ก ๋ค์ ์ค์ ์ ์๋์ ๊ฐ์ด ๋ณ๊ฒฝํด์ค์ผ ํฉ๋๋ค.
ALLOWED_HOSTS = ['127.0.0.1', '.pythonanywhere.com']
DB์ค์
๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ฅผ ์์ฑํ๊ธฐ ์ํด ์๋์ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํฉ๋๋ค. python๋ถํฐ ์ ๋ ฅํ์๋ฉด ๋ฉ๋๋ค. (์๋ ๋ช ๋ น์ด๋ฅผ ์คํํ๊ธฐ ์ํด manage.py์ด ํ์)
(prectice_venv) back$ python manage.py migratepython manage.py migrate
python๋ถํฐ ์ ๋ ฅํ์๋ฉด ๋ฉ๋๋ค. (์๋ ๋ช ๋ น์ด๋ฅผ ์คํํ๊ธฐ ์ํด manage.py์ด ํ์)
(prectice_venv) back$ python manage.py runserver
๋ธ๋ผ์ฐ์ ์์ http://127.0.0.1:8000/ ๋ฅผ ์ ๋ ฅํด ์ด์ด๋ณด์ธ์!
Django version 3.2.3, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
[19/May/2021 23:00:19] "GET / HTTP/1.1" 200 10697
[19/May/2021 23:00:19] "GET /static/admin/css/fonts.css HTTP/1.1" 200 423
[19/May/2021 23:00:19] "GET /static/admin/fonts/Roboto-Bold-webfont.woff HTTP/1.1" 200 86184
[19/May/2021 23:00:19] "GET /static/admin/fonts/Roboto-Regular-webfont.woff HTTP/1.1" 200 85876
[19/May/2021 23:00:19] "GET /static/admin/fonts/Roboto-Light-webfont.woff HTTP/1.1" 200 85692
Not Found: /favicon.ico
๐คฉ ์ฑ๊ณต!
๐ฅ Error: That port is already in use. ์ด๋ด ๊ฒฝ์ฐ port 8000๊ณผ ๊ด๋ จ๋ ๋ชจ๋ ํ๋ก์ธ์ค๋ฅผ ์ฃฝ์ด๊ณ ๋ค์ ์คํ์ํค๋ฉด ๋๋ค.
sudo lsof -t -i tcp:8000 | xargs kill -9
๐ฅ File "manage.py", line 17 from exc SyntaxError: invalid syntax python manage.py runserver์์ ์์ ๊ฐ์ ๋ฌธ์ ๊ฐ ์๊ธด๋ค๋ฉด,
1.ํ์ฌ ๊ฐ์ํ๊ฒฝ๋ด๋ถ์์ ์งํํ๊ณ ์๋์ง ์ฒดํฌํ๋ค.
๐บ ๊ฐ์ํ๊ฒฝ ํ์ฑํ ๋ฐฉ๋ฒ (prectice_venv์๋ ์ฌ๋ฌ๋ถ์ด ๋ง๋ ๊ฐ์ํ๊ฒฝ ์ด๋ฆ) mac os (shell์์) - source prectice_venv/bin/activate window (cmd์์) - prectice_venv\Scripts\activat
- ํ์ฌ ์ฌ์ฉํ๋ ํ์ด์ฌ์ ๋ฒ์ ์ ์ง์ ํด์ ์คํํ๋ค.
python3 manage.py runserver
ํน์ง: ๊ฐ์ฒด์งํฅ์ ์ค๊ณ, ์ฅ๊ณ ์์ ์๋ ๋ชจ๋ธ์ ๊ฐ์ฒด์ ํน๋ณํ ์ข ๋ฅ, ์ด ๋ชจ๋ธ์ ์ ์ฅํ๋ฉด ๊ทธ ๋ด์ฉ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ฉ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ํ๋ ๊ฑธ๋ก ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. ํ์ง๋ง ์ด๋ฒ ๋ ํฌ์์๋ ์ฐ์ต์ฉ์ด๋ฏ๋ก SQLite(๊ธฐ๋ณธ ์ฅ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ํฐ)๋ฅผ ์ฌ์ฉํ๋๋ก ํ๊ฒ ์ต๋๋ค.
์๋์ ๊ฐ์ด ์ ๋ ฅํด์ฃผ๋ฉด ์๋์ผ๋ก ํ์ด์ฌ ํจํค์ง๊ฐ ๊ตฌ์ฑ๋ฉ๋๋ค. ์ฑ์ ๊ธฐ๋ณธ ๋๋ ํฐ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์๋์ผ๋ก ์์ฑํ ์ ์๋ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์, ์ฝ๋์๋ง ๋์ฑ ์ง์คํ ์ ์์ต๋๋ค.
python3 manage.py startapp blog
๊ทธ๋ฌ๋ฉด ์๋์ ๊ฐ์ ํด๋ ๊ตฌ์กฐ๋ฅผ ๋ณด์ค ์ ์์ ๊ฒ๋๋ค.
.
โโโ ๐ blog
โ โโโ ๐ migrations
โ โโโ ๐ __ init __.py
โ โโโ ๐ __init__.py
โ โโโ ๐ admin.py
โ โโโ ๐ models.py
โ โโโ ๐ tests.py
โ โโโ ๐ views.py
โโโ
์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑ ํ ์ฅ๊ณ ์๊ฒ ์ฌ์ฉํ๋ค๊ณ ์๋ ค์ฃผ๊ฒ ์ต๋๋ค. mysite/settings.py ์์ ์์ ํด์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค. INSTALLED_APPS์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์ฑ์ ํด๋๋ค์์ ์ถ๊ฐํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog', // ์ฌ๊ธฐ ์ถ๊ฐ
]
model.pyํ์ผ์ ๋ชจ๋ธ์ ์ ์ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฝ๋๋ ๐๐ป ์ฝ๋๋ก๋ฐ๋ก๊ฐ๊ธฐ(ํด๋ฆญ) ๋๋ ์ ๋ ํ์งํ ๋ฆฌ back/blog/model.py์์ ํ์ธํ์๋ฉด ๋ฉ๋๋ค.
- Class๋ก ๊ฐ์ฒด์ ์๋ฅผ ํด์ค ์ ์๋ค.
- Class ๋ชจ๋ธ์ด๋ฆ -> ์ ๊ฐ์ ํ์์ผ๋ก ๋ชจ๋ธ์ด๋ฆ์ ์ ์ ํ ์ ์๋๋ฐ, ํญ์ ์ฒซ ๊ธ์๋ ๋๋ฌธ์ ์ฌ์ผํฉ๋๋ค.
- models๋ ์ฅ๊ณ ๋ชจ๋ธ์์ ์๋ ค์ค -> ํด๋น ๋ชจ๋ธ์ด DB์ ์ ์ฅ๋์ด์ผ ํจ์ ์๋ ค์ค๋๋ค.
- ์์ฑ์ ์ ์ํ๊ณ ๋ฐ์ดํฐ ํ์ ์ ์๋ ค์ฃผ์ด์ผ ํฉ๋๋ค.
title = models.CharField(max_length=200)
- def๋ก ๋ฉ์๋๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
์ฅ๊ณ ๋ชจ๋ธ์ ์ฐ๋ฆฌ๊ฐ ๋ฐฉ๊ธ ๋ชจ๋ธ ๋ง๋ค์๊ณ , ์์ ํ๋ค๊ณ ์๋ ค์ค๋ค.
python3 manage.py makemigrations blog
์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ถ๊ฐํ๋ค.
python3 manage.py migrate blog
// ํ๋ฉด ์๋์ ๊ฐ์ด ๋ฌ๋ค.
Operations to perform:
Apply all migrations: blog
Running migrations:
Applying blog.0001_initial... OK