๐Ÿ”ฅTIL#4. ์š”์ฒญ(Get, Post)์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ urls, models, views ์ •๋ฆฌ ๋ฐ Test๋ฅผ ์œ„ํ•œ Tool ์•ˆ๋‚ด

๋ฐฑ์Šน์ง„ยท2020๋…„ 11์›” 2์ผ
0

wecode Django ์‹ค์Šต

๋ชฉ๋ก ๋ณด๊ธฐ
6/16

What you will learn?

  1. project urls.py, app urls.py ์— ๋Œ€ํ•œ ์ดํ•ด์™€ ์„ค์ • ๋ฐฉ๋ฒ•
  2. app views.py๋ฅผ ํ†ตํ•ด request ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ ๋ฐ response ๋ฐฉ๋ฒ•
  3. app models.py ์—์„œ ์ผ๋ถ€ Tip
  4. Test tool ์•ˆ๋‚ด

1. project urls.py, app urls.py ์— ๋Œ€ํ•œ ์ดํ•ด์™€ ์„ค์ • ๋ฐฉ๋ฒ•

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()๊ฐ€ ํ˜ธ์ถœ ๋œ๋‹ค.

2. app views.py๋ฅผ ํ†ตํ•ด request ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ ๋ฐ response ๋ฐฉ๋ฒ•

์ด์ œ 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์‘๋‹ต์„ ๋ณด๋‚ธ๋‹ค.

3. app models.py ์—์„œ ์ผ๋ถ€ Tip

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์— ์•Œ๋ฆฌ๋Š” ๊ฒƒ์ด ๋œ๋‹ค.

4. Test tool ์•ˆ๋‚ด

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"

profile
12๋…„ .NET ๊ฐœ๋ฐœ ๊ฒฝ๋ ฅ์„ ๊ฐ€์ง„ ์›น ์ดˆ์งœ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค :)

0๊ฐœ์˜ ๋Œ“๊ธ€