Python 기반 마이크로 웹 프레임워크
python -m venv venv
.\venv\Scripts\activate
pip install flask
app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_flask():
return "Hello World!"
if __name__ == "__main__":
app.run()
@ : 파이썬 데코레이터
Enter
👇
💡 Client와 Server는 HTTP 프로토콜 방식으로 통신한다!
📌
URI ( Uniform Resource Identifier, 통합 자원 식별자 ) : 인터넷에 있는 자원을 나타내는 유일한 주소
HTTP Method : 자원에 대한 행위를 나타내는 수단 ( GET, POST, PUT, PATCH, DELETE 등이 있음 )
예시 # 1 REST API
👉 자원(Resource) 은 모두 /order
으로 이어도 HTTP Method에 따라서 행위가 달라짐.
🔥 REST API의 Stateless (상태 비보존형)
예시 # 2 REST API Stateless
POST /shoes
는 자원에 새로운 정보를 생성GET /shoes
는 DB에서 shoes가 있는지 확인 후 해당 자원 반환👉 (서버 입장에서) 아이템을 GET 하기 위해서 POST를 진행할 필요가 없음
Coffee Shop Menu API 구축
같은 자원(Menu)에 대해서 다른 로직을 구현
@app.route('/menus', method=['POST'])
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('/')
def hello_flask():
return "Hello World!"
# GET /menus | 자료를 가지고 온다.
@app.route('/menus')
def get_menus():
return jsonify({"menus": menus})
# POST /menus | 자료를 자원에 추가한다.
@app.route('/menus', methods=['POST'])
def create_menus(): # request가 JSON이라고 가정
# 전달받은 자료를 menus 자원에 추가
request_data = request.get_json() # {"id": ..., "name": ..., "price": ...},
new_menu = {
"id": 4,
"name": request_data['name'],
"price": request_data['price'],
}
menus.append(new_menu)
return jsonify(new_menu)
if __name__ == "__main__":
app.run()
Postman을 통해 API 테스트 진행
GET menus/
POST menus/
GET menus/
🏃♂️필수 과제: 메뉴 관리 CRUD 구현하기
PUT
를 이용해 Update, DELETE
를 이용해 Delete 기능을 구현해주세요.PUT /menu/<int:id>
: 해당하는 id에 해당하는 데이터를 갱신합니다. (HTTPRequest의 Body에 갱신할 내용이 json
으로 전달됩니다.)DELETE /menu/<int:id>
: 해당하는 id에 해당하는 데이터를 삭제합니다.@app.route()
의 인자로 들어가는 경로에는 다음과 같이 사용해줄 수도 있습니다.PUT /menu/<int:id>
구현
# PUT /menus/<int:id> | 자료를 자원에서 수정한다.
@app.route('/menus/<int:menu_id>', methods=['PUT'])
def update_menus(menu_id):
request_data = request.get_json()
for menu in menus:
if menu['id'] == menu_id:
menu['name'] = request_data['name']
menu['price'] = request_data['price']
return jsonify(menu)
return jsonify({'error_msg': "해당 자료가 존재하지 않습니다!"})
DELETE /menu/<int:id>
구현
# DELETE /menus/<int:id> | 자료를 자원에서 삭제한다.
@app.route('/menus/<int:menu_id>', methods=['DELETE'])
def delete_menus(menu_id):
request_data = request.get_json()
for i, menu in enumerate(menus):
if menu['id'] == menu_id:
return jsonify(menus.pop(i))
return jsonify({'error_msg': "해당 자료가 존재하지 않습니다!"})
🏃♂️보너스 과제 1: ID야 움직여라 얍1
POST
영역에서 id가 4로 고정되어있는 문제가 발생합니다.menu
리스트에 추가될 수 있도록 코드를 수정해주세요.next_id = len(menus) + 1
...
@app.route('/menus', methods=['POST'])
def create_menus():
global next_id # 수정
request_data = request.get_json()
new_menu = {
"id": next_id, # 수정
"name": request_data['name'],
"price": request_data['price'],
}
menus.append(new_menu)
next_id += 1 # 수정
return jsonify(new_menu)