๐Ÿ“ REST API ๋ž€ ?

REST API : REST ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋น„์Šค API(Application Interface) ๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒƒ์„ REST API ๋ผ๊ณ  ํ•œ๋‹ค.

 

[Flask] (2) REST & HTTP Method & API/End Point

๐Ÿ“ REST๋ž€ ๋ฌด์—‡์ธ๊ฐ€ ? REST : Representational State Transfer = ์ž์›์„ ์ด๋ฆ„(์ž์›์˜ ํ‘œํ˜„)์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ํ•ด๋‹น ์ž์›์˜ ์ƒํƒœ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. = ์ฆ‰, ์ž์›(resourece) ์˜ ํ‘œํ˜„(representation)์— ์˜ํ•œ "..

youngminieo1005.tistory.com

์ตœ๊ทผ OpenAPI (๋ˆ„๊ตฌ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณต๊ฐœ๋œ API), ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค ๋“ฑ์„ ์ œ๊ณตํ•˜๋Š” ๊ธฐ์—…์—์„œ๋Š” ๋Œ€๋ถ€๋ถ„ REST API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

๐Ÿ’ก REST API ํŠน์ง•

  • REST ๊ธฐ๋ฐ˜์œผ๋กœ ์‹œ์Šคํ…œ์„ ๋ถ„์‚ฐํ•˜์—ฌ ํ™•์žฅ์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์—ฌ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•  ์ˆ˜  ์žˆ๋‹ค.
  • REST๋Š” HTTP ํ‘œ์ค€์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ , HTTP๋ฅผ ์ง€์›ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์–ธ์–ด๋กœ ํด๋ผ์ด์–ธํŠธ,์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ, REST API๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด, ํด๋ผ์ด์–ธํŠธ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, JAVA, C#, WEB ๋“ฑ์„ ์ด์šฉํ•ด์„œ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ก REST API ๊ทœ์น™

REST์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ธฐ๋ณธ์ ์ธ ๊ทœ์น™์€ ๋‘ ๊ฐ€์ง€์ด๋‹ค.
URI๋Š” ์ž์›์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•™, ํ–‰์œ„์— ๋Œ€ํ•œ ์ •์˜๋Š” HTTP Method๋ฅผ ํ†ตํ•ด ํ•˜๋Š” ๊ฒƒ์ด REST API๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ํ•ต์‹ฌ์ด๋‹ค.

1. URI๋Š” ์ •๋ณด์˜ ์ž์›์„ ํ‘œํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

  • ๋ฆฌ์†Œ์Šค๋ช…์€ ๋™์‚ฌ๋ณด๋‹ค๋Š” ๋ช…์‚ฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • URI๋Š” ์ž์›์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ์— ์ค‘์ ์„ ๋‘์–ด์•ผํ•œ๋‹ค.
  • GET๊ฐ™์€ ํ–‰์œ„์— ๋Œ€ํ•œ ํ‘œํ˜„์ด ๋“ค์–ด๊ฐ€์„œ๋Š” ์•ˆ๋œ๋‹ค.
#์•ˆ ์ข‹์€ ์˜ˆ์‹œ
GET /getTodos/3
GET /todos/show/3
#์ข‹์€ ์˜ˆ์‹œ
GET /todos/3

2. ์ž์›์— ๋Œ€ํ•œ ํ–‰์œ„๋Š” HTTP Method(GET, POST, PUT, DELETE ๋“ฑ)์œผ๋กœ ํ‘œํ˜„ํ•œ๋‹ค.

์ฃผ๋กœ 5๊ฐ€์ง€์˜ Method(GET, POST, PUT, DELETE , PATCH)๋ฅผ ์‚ฌ์šฉํ•ด์„œ CRUD๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

[ ์ถœ์ฒ˜ : elice ]

#์•ˆ ์ข‹์€ ์˜ˆ์‹œ
GET /todos/delete/3
#์ข‹์€ ์˜ˆ์‹œ
DELETE /todos/3

 

๐Ÿ“ RESTful ์ด๋ž€ ?

  • RESTful์€ ์ผ๋ฐ˜์ ์œผ๋กœ REST๋ผ๋Š” ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์›น ์„œ๋น„์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์šฉ์–ด์ด๋‹ค.
  • ๋”ฐ๋ผ์„œ REST API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์›น ์„œ๋น„์Šค๋ฅผ ์šฐ๋ฆฌ๋Š” "RESTfulํ•˜๋‹ค"๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • RESTful์€ REST๋ฅผ REST๋‹ต๊ฒŒ ์“ฐ๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ณต์‹์ ์œผ๋กœ ๋ฐœํ‘œํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.
  • REST์˜ ์›๋ฆฌ๋ฅผ ๋”ฐ๋ฅด๊ณ  ์‚ฌ์šฉํ•˜๋Š” ์‹œ์Šคํ…œ์„ RESTful์ด๋ผ๋Š” ์šฉ์–ด๋กœ ์นญํ•˜๊ฒŒ ๋œ๋‹ค.

๐Ÿ’ก RESTful์˜ ๋ชฉ์ ์€ ๋ฌด์—‡์ธ๊ฐ€ ?

์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ์‰ฌ์šด REST API๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.

  • RESTfulํ•œ API๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ทผ๋ณธ์ ์ธ ๋ชฉ์ ์ด ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ์ค‘์ ์ด ์•„๋‹ˆ๋‹ค.
  • API์˜ ์ดํ•ด๋„์™€ ํ˜ธํ™˜์„ฑ์„ ๋†’์ด๋Š” ๊ฒƒ์ด ์ฃผ๋œ ๋ชฉ์ ์ด๋‹ค.
  • ๋”ฐ๋ผ์„œ, ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ์ƒํ™ฉ์—์„œ๋Š” ๊ตณ์ด RESTfulํ•œ API๋ฅผ ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

๐Ÿ“ REST API ์„ค๊ณ„ ๊ธฐ๋ณธ ๊ทœ์น™

1. URI๋Š” ์ •๋ณด์˜ ์ž์›์„ ํ‘œํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

  • ์ž์›์€ ๋™์‚ฌ๋ณด๋‹ค๋Š” ๋ช…์‚ฌ๋ฅผ ์‚ฌ์šฉ
  • ์ž์›์€ ๋Œ€๋ฌธ์ž๋ณด๋‹ค๋Š” ์†Œ๋ฌธ์ž ์‚ฌ์šฉ
  • ์ž์›์˜ ๋„ํ๋จผํŠธ ์ด๋ฆ„์œผ๋กœ๋Š” ๋‹จ์ˆ˜ ๋ช…์‚ฌ๋ฅผ ์‚ฌ์šฉ
  • ์ž์›์˜ ์ปฌ๋ ‰์…˜ ์ด๋ฆ„์œผ๋กœ๋Š” ๋ณต์ˆ˜ ๋ช…์‚ฌ๋ฅผ ์‚ฌ์šฉ
  • ์ž์›์˜ ์Šคํ† ์–ด ์ด๋ฆ„์œผ๋กœ๋Š” ๋ณต์ˆ˜ ๋ช…์‚ฌ๋ฅผ ์‚ฌ์šฉ
#์•ˆ ์ข‹์€ ์˜ˆ์‹œ
GET /Student/3
#์ข‹์€ ์˜ˆ์‹œ
GET /students/3 # ์†Œ๋ฌธ์ž,๋ณต์ˆ˜๋ช…์‚ฌ ์‚ฌ์šฉ

2. ์ž์›์— ๋Œ€ํ•œ ํ–‰์œ„๋Š” HTTP Method(GET, POST, PUT, DELETE ๋“ฑ)๋กœ ํ‘œํ˜„ํ•œ๋‹ค.

- URI์— HTTP Method๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉด ์•ˆ๋œ๋‹ค.

#์•ˆ ์ข‹์€ ์˜ˆ์‹œ
GET /students/delete/3
#์ข‹์€ ์˜ˆ์‹œ
DELETE /students/3

- CRUD ๊ธฐ๋Šฅ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์€ URI์— ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

#์•ˆ ์ข‹์€ ์˜ˆ์‹œ
GET /students/show/3
GET /students/insert/4
#์ข‹์€ ์˜ˆ์‹œ
GET /students/3
POST /students/4
  • : id ๋Š” ํ•˜๋‚˜์˜ ํŠน์ • ์ž์›์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ณ ์œ ๊ฐ’์ด๋‹ค.

    ex) student๋ฅผ ์ƒ์„ฑํ•˜๋Š” route : POST/students
    ex) id=12์ธ student๋ฅผ ์‚ญ์ œํ•˜๋Š” route: DELETE/students/12

๐Ÿ”Š ์šฉ์–ด

  • ๋„๊ทœ๋จผํŠธ : ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ ˆ์ฝ”๋“œ์™€ ์œ ์‚ฌํ•œ ๊ฐœ๋…
  • ์ปฌ๋ ‰์…˜ : ์„œ๋ฒ„์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๋ผ๋Š” ์ž์›
  • ์Šคํ† ์–ด : ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์ž์› ์ €์žฅ์†Œ

 

๐Ÿ“ REST API ์„ค๊ณ„ ๊ทœ์น™

1. ์Šฌ๋ž˜์‹œ (/) ๋Š” ๊ณ„์ธต ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

ex) https://academy.elice.io/classroom/teach 

2. URI ๋งˆ์ง€๋ง‰ ๋ฌธ์ž๋กœ ์Šฌ๋ž˜์‹œ (/) ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.

ex) https://academy.elice.io/classroom/teach/ โ† ( X )

  • URI์— ํฌํ•จ๋˜๋Š” ๋ชจ๋“  ๊ธ€์ž๋Š” ์ž์›์˜ ์œ ์ผํ•œ ์‹๋ณ„์ž๋กœ ์‚ฌ์šฉ๋˜์•ผ ํ•œ๋‹ค.
  • URI๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์€ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ž์›์ด ๋‹ค๋ฅด๋‹ค๋Š” ๋œป์ด๊ณ , ๋ฐ˜๋Œ€๋กœ ์ž์›์ด ๋‹ค๋ฅด๋ฉด URI๋„ ๋‹ฌ๋ผ์ ธ์•ผ ํ•œ๋‹ค.
  • REST API๋Š” ๋ถ„๋ช…ํ•œ URI๋ฅผ ๋งŒ๋“ค์–ด ํ†ต์‹ ์„ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜ผ๋™์„ ์ฃผ์ง€ ์•Š๋„๋ก URI ๊ฒฝ๋กœ์˜ ๋งˆ์ง€๋ง‰์—๋Š”
    ์Šฌ๋ž˜์‹œ (/) ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

3. ํ•˜์ดํ”ˆ (-) ์€ URI ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

4. ๋ฐ‘์ค„ ( _ ) ์€ URI์— ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

5. URI ๊ฒฝ๋กœ์—๋Š” ์†Œ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

6. ํŒŒ์ผํ™•์žฅ์ž๋Š” URI์— ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.

ex) https://academy.elice.io/classroom/teach/111/python.png โ† ( X )
ex) GET / classroom/teach/111/python HTTP/1.1 Host: academy.elice.io Accept: image/png โ† ( O )

7. ์ž์› ๊ฐ„์— ์—ฐ๊ด€ ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•œ๋‹ค.

/์ž์›๋ช…/์ž์›ID/๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๋‹ค๋ฅธ ์ž์›๋ช…
ex) GET : /students/{studentid}/classroom

[ ์ถœ์ฒ˜ : elice ]

 

๐Ÿ“ REST API : CRUD ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ

์•ž์„  ํฌ์ŠคํŒ… ( Flask 1~ 6 )์„ ๋ณด๋ฉด, render_template( ) ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ, html์— ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ๋„์›Œ ๊ฐ’๋“ค์„ ํ™•์ธํ–ˆ์—ˆ๋‹ค.๊ทธ๋ฆฌ๊ณ  html์—์„œ๋Š” jinja2 ๋ฌธ๋ฒ•์œผ๋กœ ํ•ด๋‹น ๋‚ด์šฉ์„ ๋ฐ›์•„์„œ html์— ๋„์šธ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์ด๋Š” "API ์„œ๋ฒ„"๋ฅผ ๊ฐœ๋ฐœํ•œ ๊ฒƒ์ด ์•„๋‹Œ, Flask๋ฅผ ํ™œ์šฉํ•ด์„œ "์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜"์„ ๊ฐœ๋ฐœํ•œ ๊ฒƒ์ด๋‹ค.

REST API ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœ ํ•  ๋•Œ๋Š”, ์„œ๋ฒ„๋‹จ์—์„œ ์ง์ ‘ ๋ Œ๋”๋ง(Rendering)ํ•ด์„œ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ
์›น ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ "์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜" ํ•ด์ฃผ๋„๋ก ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ, ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ(ํ”„๋ก ํŠธ ์—”๋“œ) ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์Œ์œผ๋กœ์จ ํ†ต์‹ ์„ ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿ”Š ์›น ์ƒ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” ๋ฐ์ดํ„ฐ ํ˜•์‹์€ JSON ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š”๋‹ค.

๐Ÿ”Š [Tips] REST API๋ฅผ ์œ„ํ•ด ๊ตฌํ˜„๋˜๋Š” CRUD์˜ ๋ฉ”์†Œ๋“œ์™€ URL์˜ ์ด๋ฆ„์€ CRUD์— ๋งž์ถ”๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค.

 

from flask import Flask, render_template, request, redirect, url_for
import json
app = Flask(__name__)
board = [] # ์‹ค์ œ DB๊ฐ€ ์•„๋‹Œ, ์˜ˆ์ œ๋ฅผ ์œ„ํ•œ board ๋ฆฌ์ŠคํŠธ
# root ๊ฒฝ๋กœ
@app.route('/')
def index():
return render_template("Boards.html", rows = board)
# POST : CREATE (C)
@app.route("/create", methods=["POST"])
def create():
name = request.form["name"]
context = request.form["context"]
board.append([name,context])
return json.dumps( { "status":200, "result" : { "id" : len(board)} } ) # json.dumps({ HTTP ์ƒํƒœ, ๋ฐ˜ํ™˜ํ•  ๊ฒฐ๊ณผ }) = ๋ฐ์ดํ„ฐ๋ฅผ json ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•ด์ค€๋‹ค.
# GET : READ (R)
@app.route("/read", methods=["GET"])
def read():
return json.dumps({"status":200, "result":board})
if __name__ == '__main__':
app.run()
<!-- ./templates/Boards.html -->
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlusยฎ">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>๊ฒŒ์‹œํŒ ๋“ฑ๋ก</title>
<style type="text/css">
body{ text-align: center; }
</style>
</head>
<body>
<h1>๊ฒŒ์‹œํŒ</h1>
<h4>์ถ”๊ฐ€</h4>
<form action = "/create" method = "POST">
์ด๋ฆ„<br>
<input type = "text" name = "name" /><br>
๋‚ด์šฉ<br>
<textarea name = "context" cols="50" rows="10"></textarea><br><br>
<input type = "submit" value = "๊ฒŒ ์‹œ" /><br>
</form>
<h4>๋ชฉ๋ก๋ณด๊ธฐ</h4>
<table class="table" border="1" width = 600 style = "word-break:break-all" style="table-layout: fixed" align="center">
<thread>
<th width="4%">๋ชฉ์ฐจ</th>
<th width="15%">์ด๋ฆ„</th>
<th width="25%">๋‚ด์šฉ</th>
</thread>
{% for row in rows %}
<tr>
<td>{{ loop.index }}</td>
<td>{{ row[0] }}</td>
<td>{{ row[1] }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>

๐Ÿ’ก CREATE : POST

ํŽ˜์ด์ง€์—์„œ ๋ฐ์ดํ„ฐ ์ž…๋ ฅ
์ž…๋ ฅ๋œ ๊ฐ’์„ json ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•œ๊ฒƒ์„ ๋ฐ˜ํ™˜ํ•œ ๊ฒฐ๊ณผ

 

๐Ÿ’ก READ : GET

/read ๋กœ GET ํ–ˆ์„ ๋•Œ ( ๋ฐ์ดํ„ฐ ํ•˜๋‚˜๋„ ์ž…๋ ฅ ์•ˆํ•œ์ƒํ™ฉ )

 

๐Ÿ“Œ UPDATE(PUT)์™€ DELETE(DLEDTE)๋Š” ์•ž์„ , CREATE(POST), READ(GET)๊ณผ ๋‹ฌ๋ฆฌ, Ajax๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„๋˜๊ธฐ๋„ ํ•œ๋‹ค.

๐Ÿ“ Ajax : ๋น„๋™๊ธฐ์‹(Asynchronous)  JavaScript + XML ์ด๋‹ค.

Ajax ๋Š” REST API๋ฅผ ์†์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” "ํ”„๋ ˆ์ž„์›Œํฌ"์ด๋ฉฐ, html ํŒŒ์ผ์—์„œ ๊ฐ„๋‹จํžˆ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•ด๋ณด์ž.
( ์ด๋ฒˆ์—๋Š”, html ํŒŒ์ผ์„ ๋”, ์ฃผ์˜๊นŠ๊ฒŒ ๋ณด์ž. ( Ajax ๋ถ€๋ถ„ ) )

# Ajax_Example.py
from flask import Flask, render_template, request, jsonify # Flask์˜ ๋‚ด์žฅ๋œ jsonify = json.dump() ์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด๋‹ค. json ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜
app = Flask(__name__)
board = [] # ์ž„์‹œ DB ๊ฐœ๋… (์‚ฌ์‹ค,๋ฆฌ์ŠคํŠธ)
# root
@app.route("/")
def index():
return render_template("ajax_index.html", rows=board)
@app.route("/ajax", methods=["POST"])
def ajax():
data = request.get_json() # request.get_json() = POST ์š”์ฒญ์„ ํ†ตํ•ด ์–ป์€ ๋ฐ์ดํ„ฐ -> json ํ˜•์‹์œผ๋กœ ์–ป๊ธฐ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ
board.append(data)
return jsonify(result="success", result2=data) # json_dumps({}) ์™€ ๊ธฐ๋Šฅ์€ ๊ฐ™๋‹ค.
if __name__ == '__main__':
app.run()
<!--ajax_index.html-->
<html>
<head>
<script src="https://code.jquery.com/jquery-latest.min.js"></script>
</head>
<body>
<p id="example">AJAX</p>
<input type="text" id="id1" placeholder="id">
<input type="text" id="name1" placeholder="name">
<input type="text" id="context1" placeholder="context">
<input type="button" id="execute" value="execute">
<script>
$('#execute').click(function () {
var id = $('#id1').val();
var name = $('#name1').val();
var context = $('#context1').val();
var postdata = {
'id': id, 'name': name, 'context': context
}
// ajax ํ˜•์‹์œผ๋กœ -> ajax example.py๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก
$.ajax({
type: 'POST',
url: '{{url_for("ajax")}}',
data: JSON.stringify(postdata), // ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ธธ๋•Œ๋Š”, JSON.stringify(๋ฐ์ดํ„ฐ)๋กœ Stringํ˜•์‹์œผ๋กœ ๋„˜๊ฒจ์ค€๋‹ค.
dataType: 'JSON',
contentType: "application/json",
success: function (data) {
alert('์„ฑ๊ณต! ๋ฐ์ดํ„ฐ ๊ฐ’:' + data.result2['id'] + " " + data.result2['name'] + " " + data.result2['context'])
},
error: function (request, status, error) {
alert('ajax ํ†ต์‹  ์‹คํŒจ')
alert(error);
}
})
})
</script>
<table border=1 width="600">
<thead>
<td>๋ชฉ์ฐจ</td>
<td>์ด๋ฆ„</td>
<td>๋‚ด์šฉ</td>
</thead>
{% for row in rows %}
<tr>
<td>{{ loop.index }}</td>
<td>{{ row['name'] }}</td>
<td>{{ row['context'] }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>

 

 

๐Ÿ’ก UPDATE & DELETE ( PUT & DELETE )

from flask import Flask, render_template, jsonify, request
app = Flask(__name__)
board = [{"id": 1, "name": "elice", "context": "test"}]
@app.route('/')
def index():
return render_template('index.html', rows = board)
@app.route('/create', methods=['POST'])
def create():
data = request.get_json()
board.append(data)
return jsonify(result = "success", result2= data)
@app.route('/delete', methods=['POST'])
def delete():
del board[-1]
return jsonify(result="success")
@app.route('/put', methods=['POST'])
def put():
data = request.get_json()
board.append(data)
return jsonify(result="success",result2=data)
<!--index.html-->
<html>
<head>
<script src="https://code.jquery.com/jquery-latest.min.js"></script>
</head>
<body>
<p id="example">AJAX</p>
<input type="text" id="id1" placeholder="id">
<input type="text" id="name1" placeholder="name">
<input type="text" id="context1" placeholder="context">
<input type="button" id="create" value="create">
<input type="button" id="update" value="update">
<input type="button" id="delete" value="delete">
<script>
// POST (CREATE)
$('#create').click(function(){
var id = $('#id1').val();
var name = $('#name1').val();
var context = $('#context1').val();
var postdata = {
'id':id, 'name':name, 'context':context
}
$.ajax({
type: 'POST',
url: '{{url_for("create")}}',
data: JSON.stringify(postdata),
dataType : 'JSON',
contentType: "application/json",
success: function(data){
alert('์„ฑ๊ณต! ๋ฐ์ดํ„ฐ ๊ฐ’:' + data.result2['id']+" " + data.result2['name']+ " " + data.result2['context'])
},
error: function(request, status, error){
alert('ajax ํ†ต์‹  ์‹คํŒจ')
alert(error);
}
})
})
// PUT (UPDATE)
$('#update').click(function(){
var id = $('#id1').val();
var name = $('#name1').val();
var context = $('#context1').val();
var postdata = {
'id':id, 'name':name, 'context':context
}
$.ajax({
type: 'POST',
url: '{{url_for("put")}}',
data: JSON.stringify(postdata),
dataType : 'JSON',
contentType: "application/json",
success: function(data){
alert('์„ฑ๊ณต! ์ˆ˜์ •๋œ ๋ฐ์ดํ„ฐ ๊ฐ’:' + data.result2['id']+" " + data.result2['name']+ " " + data.result2['context'])
},
error: function(request, status, error){
alert('ajax ํ†ต์‹  ์‹คํŒจ')
alert(error);
}
})
})
// DELETE (DELETE)
$('#delete').click(function(){
$.ajax({
type: 'POST',
url: '{{url_for("delete")}}',
contentType: "application/json",
success: function(){
alert('์„ฑ๊ณต! ๋ฐ์ดํ„ฐ ์‚ญ์ œ ์™„๋ฃŒ')
},
error: function(request, status, error){
alert('ajax ํ†ต์‹  ์‹คํŒจ')
alert(error);
}
})
})
</script>
<table border=1 width="600">
<thead>
<td>๋ชฉ์ฐจ</td>
<td>์ด๋ฆ„</td>
<td>๋‚ด์šฉ</td>
</thead>
{% for row in rows %}
<tr>
<td>{{ loop.index }}</td>
<td>{{ row['name'] }}</td>
<td>{{ row['context'] }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>

 

728x90
๋ฐ˜์‘ํ˜•

+ Recent posts