API : 프로그램들이 서로 상호작용하는 것을 도와주는 매개체
HTTP URI를 통해 자원을 명시하고
HTTP Method를 통해 해당 자원에 대한 CRUD를 진행
Clint의 context를 Server에서 유지하지 않는다. (clinet들이 요청한 결과로 모두 동일해야함.)
ex)
POST/shoes
: 자원(shoes)에 새로운 정보를 생성
GET/shoes
: DB에서 shoes가 있는지 확인 후 해당 자원 반환
(서버 입장에서) 아이템을 GET
하기 위해 POST
를 진행할 필요 없음!
jsonify : 파이썬의 딕셔너리 타입 --> json 타입으로 변경해주는 모듈
from flask import Flask, jsonify, request
app = Flask(__name__) # 객체 생성
menus = [
{'id' : 1, 'name' : 'Espresso', 'price' : 3800},
{'id' : 2, 'name' : 'Americano', 'price' : 4100},
{'id' : 3, 'name' : 'CafeLatte', 'price' : 4600}
]
@app.route('/') # @ : decorator, '/'주소를 요청받았을 때 밑에 있는 함수를 실행하라는 뜻
def hello_flask():
return 'Hello World!'
# GET /menus : menus 자료를 가지고 온다.
@app.route('/menus') # methods의 기본값은 GET이므로 methods =['GET']을 쓸 필요 없음.
def get_menus():
# menus는 list타입인데, list 타입의 경우 json으로 변환 불가능
# --> menus를 value로 하는 딕셔너리를 만들어서 json 타입으로 변환한다.
return jsonify({'menus' : menus})
# POST /menus : 자료를 menus 자원에 추가한다.
@app.route('/menus', methods = ['POST'])
def create_menu():
# client로 부터 전달받은 자원을 menus 자원에 추가.
#(이때 전달받은 자원의 형태는 json이라고 가정)
request_data = request.get_json() # {'name' : ..., 'price' : ...}
try:
# 새로 추가하는 메뉴의 id : 가장 마지막 menu id에 1 더한 것
id = menus[-1]['id'] + 1
except: # menus에 메뉴가 존재하지 않는 경우, 새로 추가하는 메뉴의 id는 1이다.
id = 1
new_menu = {
'id' : id,
'name' : request_data['name'],
'price' : request_data['price']
}
menus.append(new_menu) # menus자원에 추가
return jsonify(new_menu)
# PUT /menus/id : id값을 입력으로 받아서 menus 자원들 중 id값에 해당하는 자원을 수정
@app.route('/menus/<int:id>', methods = ['PUT'])
def update_menu(id):
for m in menus:
if m['id'] == id:
update_menu = m
break
request_data = request.get_json() # 수정할 내용:{'name' : ..., 'price' : ...}
try:
update_menu['name'] = request_data.get('name', update_menu['name'])
update_menu['price'] = request_data.get('price', update_menu['price'])
except: # update하고자 하는 id가 menus에 존재 안하는 경우
return {'update ' + str(id) : 'fail'}
return jsonify(request_data)
# DELETE /menus/id : id값을 입력으로 받아서 menus 자원들 중 id값에 해당하는 자원 삭제
@app.route('/menus/<int:id>', methods = ['DELETE'])
def delete_menu(id):
for i,m in enumerate(menus):
if m['id'] == id:
del_id = i
break
try:
del menus[del_id]
except: # 삭제하고자 하는 id가 menus에 존재 안하는 경우
return {'delete ' + str(id) : 'fail'}
return {'delete ' + str(id) : 'success'}
if __name__ == '__main__': # app.py를 직접적으로 실행하는 경우 app을 실행하라 라는 뜻
app.run()
postman 다운받기 : https://www.postman.com/downloads/
1-1. root 정보 GET
1-2. menus 정보 GET
id가 1번인 menu의 가격을 3000원으로 업데이트하자.
--> 그 결과 아래 사진처럼 1번 메뉴의 가격이 바뀌었다.
4번메뉴를 삭제해보자.
--> 그 결과 아래 사진처럼 4번 메뉴가 삭제되었다.
❓But : server를 껐다 키면 정보가 사라짐.--> DB가 필요함. --> Flask와 DB연동은 어떻게 할까?❓