What you will learn?
- project urls.py, app urls.py ์ ๋ํ ์ดํด์ ์ค์ ๋ฐฉ๋ฒ
- app views.py๋ฅผ ํตํด request ์ ๋ํ ์ฒ๋ฆฌ ๋ฐ response ๋ฐฉ๋ฒ
- app models.py ์์ ์ผ๋ถ Tip
- Test tool ์๋ด
Django์ project ํด๋์ ์๋ urls.py๋ url Dispatcher์ ์ญํ ์ ํ๋ค. ์ฐ๋ฆฌ๊ฐ Web Service์ ์์ฒญ์ ํ๋ค๋ ๊ฒ์ ์ฃผ๋ก url์ ์
๋ ฅํ์ฌ ์ ๋ณด๋ฅผ Get ํ๊ฑฐ๋ url๊ณผ ํจ๊ป ์กฐ๊ฑด์ ์
๋ ฅํ์ฌ Post ํ๋ ๊ฒ์ผ๋ก ๋ณผ ์ ์๋ค.(๋ค๋ฅธ Http ์์ฒญ๋ฐฉ์๋ ์์ผ๋ ์ฃผ๋ก Get, Post๋ฅผ ๋ง์ด ์ฌ์ฉ)
Django๋ ์ฌ์ฉ์์ ์์ฒญ์ธ url์ ๋ณด๋ฅผ ๋ถ์, ์ด๋ค App์ ๋ํ ์์ฒญ์ธ์ง๋ฅผ ํ๋จ ํ ํด๋น App์ด ์ฒ๋ฆฌํ๋๋ก ์ ๋ฌํ๋ค. ๊ทธ๋ฌ๋ฉด ํด๋น App์ ์์ฒด urls.py๋ฅผ ํ์ธ, ์ถ๊ฐ url ๊ฒฝ๋ก์ ๋ํ url Dispatcher๋ฅผ ๋ค์ ํ๋ฒ ์ํํ์ฌ ์ต์ข
url์ ๋งค์นญ๋๋ View์๊ฒ ์ฒ๋ฆฌ๋ฅผ ๋๊ธด๋ค.
ํ์ฌ ์์
์ค์ธ 'starbucks' project์ 'services' app์ ์์๋ก ์ค๋ช
ํ์๋ฉด
์๋ starbucks project์ urls.py ํ๋ฉด์ผ๋ก urlpatterns ๋ณ์์ 'services' ๋ ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐํ๊ณ ์ด๋ฅผ services์ urls.py์ ์ฐ๊ฒฐํ์๋ค. ์ธ๋ถ์์ localhost:8000/services ๋ผ๋ ์์ฒญ์ด ๋ค์ด์ค๋ฉด Django๋ services App์ urls ๋ก Dispatcher ์ญํ ์ ๋๊ธด๋ค.
App์ urls.py๋ ์ดํ url ์ ๋ณด์ ๋ฐ๋ผ ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ view๋ฅผ ์ง์ ํ๋ค. ์๋ pathํจ์๋ด์ ์ด๋ฆ์ง์ ์ ๋น์นธ์ ์ ์งํจ์ผ๋ก์ 'localhost:8000/services/'์ ๋ํ ์ฒ๋ฆฌ๋ฅผ CategoryView์๊ฒ ์์ํจ์ ์๋ฏธํ๋ค. ๋ง์ฝ ์ด๋ฆ์ ๋ถ์ฌํ๋ค๋ฉด 'localhost:8000/services/๋ถ์ฌํ์ด๋ฆ' ์ url์ ๋ํด์ CategoryView์ ์์ํ๋ค.
์ฐธ๊ณ ) view ๋ค์ as_view() ๊ฐ ์ฌ์ฉ๋๋๋ฐ ์ด๋ View ํด๋์ค์์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณต๋๋ get, post ํจ์๋ฅผ ์ฌ์ฉํ๋ค๋ ์๋ฏธ์ด๋ค. ๋ง์ฝ ์ฌ์ฉ์๊ฐ GET ์ ๋ํ ์์ฒญ์ ํ๋ฉด CategoryView๋ get()์ด ํธ์ถ๋๊ณ POST ์์ฒญ์ ํ๋ฉด post()๊ฐ ํธ์ถ ๋๋ค.
์ด์ url์ ๋ํด view์์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง๋ฅผ ์ดํด๋ณด์. url์ ๋ํ ์ฒ๋ฆฌ๋ฅผ view๊ฐ ๋ด๋นํ๋ค๊ณ ์ด์ผ๊ธฐ ํ๋ฏ์ด ์์ CategoryView๋ผ๋ class๊ฐ views.py์ ์ ์๋์ด ์์ด์ผ ํ๋ค. ์๋ ํ๋ฉด์ ๋ณด์
'services' App์ views.py์ CategoryView class๋ฅผ ์ ์ํ ํ๋ฉด์ด๋ค.
'as_view()'์ ๊ด๋ จํ์ฌ ์์ ์ค๋ช
ํ๋ฏ์ด get, post ํจ์๋ ์ฌ์ฉ์์ ์์ฒญ methodํ์
์ ๋ฐ๋ผ ํธ์ถ๋๋ฉฐ ํธ์ถ์ ์คํ๋ ๋ก์ง์ ์ ์ํด์ฃผ๋ฉด ๋๋ค. ์ฌ๊ธฐ์ get() ํธ์ถ์ Categories table์ row๋ณ id ๋ฐ name ์ ๋ณด๋ฅผ dictionary๋ก ๋ฌถ์ด json ํ์
์ผ๋ก ์๋ตํด์ฃผ๋ ๊ณผ์ ์ด๋ค.
post()์์๋ request์ ํจ๊ป ์จ ์กฐ๊ฑด์ ๋ณด(request.body)๋ฅผ python ํ์์ผ๋ก load, ์ด๋ฅผ Menu table์ ์ ๊ท row๋ก ์ถ๊ฐํ๊ณ Json์๋ต์ ๋ณด๋ธ๋ค.
models.py์์ class ์์ฑ์ ํตํด ๋ง๋ค table์ ์ค๊ณํ๋ ๊ฒ์ ์ด์ ํ์ด์ง์์ ํ์ธํ๋ค. ๊ทธ๋ฐ๋ฐ models.py์ ์ ์ํ class๊ฐ database๋ก migrate์ database ์์์์ table ๋ช
์ด class ๋ช
๊ณผ ๋ค๋ฅด๋ค. ์๋ ์์๋ฅผ ๋ณด์.
์๋ ํ๋ฉด์ 'services' app์ models.py์ ์ ์๋ class ์ ๋ณด์ด๋ค.
๋ค์ ํ๋ฉด์ ์ค์ database ์์์์ table ๋ชฉ๋ก์ด๋ค.
๋ณด๋ ๋ฐ์ ๊ฐ์ด Table ์์ app์ด๋ฆ(services + '-')์ด ์๋์ผ๋ก ๋ถ์ด์ ์์ฑ๋์ด ์๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค. ์ด๋ Django๊ฐ ์๋์ผ๋ก ๋ถ์ฌํ๋ ๊ธฐ๋ฅ์ผ๋ก ์ด ๊ธฐ๋ฅ์ ๋ฌด์ํ๊ณ ์ถ์ผ๋ฉด ์๋ ๊ณผ์ ํ๋ฉด์ฒ๋ผ ์ถ๊ฐ ๋ก์ง์ ๋ฃ์ผ๋ฉด ๋๋ค.
class์ ๋ด๋ถclass๋ก 'Meta'๊ฐ ์ ์, db_table์ด๋ ์์ฑ์ 'menus'๋ ๊ฐ์ ์
๋ ฅํ๊ณ ์๋ค.
์ด ๋ก์ง์ migrate์ Menu class๋ฅผ 'menus'๋ table๋ก ์์ฑํ๊ฒ ๋ค๊ณ Django์ ์๋ฆฌ๋ ๊ฒ์ด ๋๋ค.
Server์ ์ฒ๋ฆฌ๋ก์ง์ ํ ์คํธํ๋ ค๋ฉด requester๊ฐ ํ์ํ๋ค. web browser๋ ์์ผ๋ Terminal ์์ ํ ์คํธ ํ ์ ์๋๋ก 'httpie' ํ๋ก๊ทธ๋จ์ ์ค์นํ๋ค.
sudo apt-get install httpie
์ค์น์ฌ๋ถ๋ฅผ ํ์ธํ๋ ค๋ฉด 'http' ๋ฅผ ์คํํด๋ณด์.
jin@jin-Lenovo-IdeaPad-S340-15API:~/westagram$ http usage: http [--json] [--form] [--pretty {all,colors,format,none}] [--style STYLE] [--print WHAT] [--headers] [--body] [--verbose] [--all] [--history-print WHAT] [--stream] [--output FILE] [--download] [--continue] [--session SESSION_NAME_OR_PATH | --session-read-only SESSION_NAME_OR_PATH] [--auth USER[:PASS]] [--auth-type {basic,digest}] [--proxy PROTOCOL:PROXY_URL] [--follow] [--max-redirects MAX_REDIRECTS] [--timeout SECONDS] [--check-status] [--verify VERIFY] ....
์ฌ์ฉ๋ฒ์ ์๋์ ๊ฐ๋ค (starbucks project ๊ธฐ์ค)
http GET localhost:8000/services
http POST localhost:8000/services name="new value"