엄청난 4주차였다.
- flask서버와 index.html 클라이언트 사이의 통신
- ajax문법
- db에서 데이터를 가져와서 html으로 출력하는 방법
어느 것 하나 제대로 이해하지 못하고 수업을 마쳤기 때문에 일단 코드 분석을 통해 app.py와 index.html의 통신방법을 익히는 것에 주력했다.
index.html
function order() {
flag = false
let name = $('#input_name').val();
let count = $('#select_count').val();
let addr = $('#input_addr').val();
let phone = $('#input_phone').val();
if (name == "") {
alert("이름을 입력해주세요")
} else if (count == "-- 수량을 선택하세요 --") {
alert("수량을 입력해주세요")
return
} else if (addr == "") {
alert("주소를 입력해주세요")
return
} else if (phone == "") {
alert("전화번호를 입력해주세요")
return
} else {
alert("주문정보 : " + name + " " + count + "개 " + addr + " " + phone)
flag = true
}
if(flag){
$.ajax({
type: 'POST', //타입작성
url: '/orders', //url작성
data: {name_give:name, count_give:count, addr_give:addr, phone_give:phone},
success: function(response){
if(response['result'] == 'success'){
alert(response['msg']);
window.location.reload(); //현재페이지 새로고침
}
}
});
}
}
app.py
## API 역할을 하는 부분
@app.route('/orders', methods=['POST'])
def write_orders():
# name 가져오기
name_receive = request.form['name_give']
# count 가져오기
count_receive = request.form['count_give']
# addr 가져오기
addr_receive = request.form['addr_give']
# phone 가져오기
phone_receive = request.form['phone_give']
# DB에 삽입할 order 만들기
order = {
'name': name_receive,
'count': count_receive,
'addr': addr_receive,
'phone': phone_receive
}
# orders에 order 저장하기
db.orders.insert_one(order)
# 성공 여부 & 성공 메시지 반환
return jsonify({'result': 'success', 'msg': '주문이 성공적으로 작성되었습니다.'})
1,2) ajax를 통해서 app.py에게 어떤 방식으로, 어떤 주소로 보낼지 알려줍니다.
----> post방식으로 /oders라는 주소로 보냅니다.
----> app.py의 여러 api중 post방식, /orders라는 주소로 받기로 약속한 api와 연결됩니다.
3) 이전에 html파일의 <body>부분에서 받아놓은 정보를 data에 싣어서 app.py에게 보냅니다.
----> name, count, addr, phone 정보를 name_give, count_give, addr_give, phone_give로 포장해서 app.py에게 보내줍니다.
4) app.py에서는 request.form()을 통해서 html로부터 정보를 전달받습니다.
----> name_give, count_give, addr_give, phone_give를 받아서 name_receive, count_receive, addr_receive, phone_receive에 저장합니다.
index.html
function listing(){
//1. 리뷰 목록을 서버에 요청
//2. 요청 성공 여부 확인
//3. 요청 성공했을 때, 리뷰를 올바르게 화면에 나타내기
$.ajax({
type:"GET",
url:"/orders",
data:{},
success: function(response){
if(response['result'] == 'success'){
//요청에 성공했으면 list orders를 받아와
let orders = response['orders'];
//성공했을 때 리뷰를 올바르게 화면에 나타내기
for(let i = 0; i<orders.length; i++){
make_card(orders[i]['name'],orders[i]['count'],orders[i]['addr'],orders[i]['phone']);
}
}else{
alert('주문을 받아오지 못했습니다.');
}
}
});
}
app.py
@app.route('/orders', methods=['GET'])
def read_orders():
# 1. DB에서 주문 정보 모두 가져오기
orders = list(db.orders.find({},{'_id':0}))
# 2. 성공 여부 & 주문 목록 반환하기
return jsonify({'result': 'success', 'orders': orders})
진행 순서 :
1) ajax를 통해서 app.py에게 어떤 방식으로, 어떤 주소로 보낼지 알려줍니다.
----> get방식으로 /oders라는 주소로 보냅니다.
----> app.py의 여러 api중 get방식, /orders라는 주소로 받기로 약속한 api와 연결됩니다.
2) app.py가 db에서 정보를 가져와서 가공한 후 return을 통해 index.html에게 보내줍니다.
----> app.py에서 orders라는 리스트를 만듭니다.
----> 리스트 orders를 'orders'라는 포장지로 싸서 return으로 index.html에게 보내줍니다.
----> post방식과는 다르게 get방식은 data:{}에 정보를 넣어서 보내지 않습니다. data가 비어있습니다.
3) index.html에서는 response[]를 통해서 app.py로부터 정보를 전달받습니다.
----> 'orders'라는 포장지에 싸서 보낸 것을 새로운 변수 orders에 넣어서 저장합니다.
----> app.py에서 리스트를 보냈기 때문에 index.html에서 받은 변수도 리스트라는 것을 알 수 있습니다.
다음 주부터는 본격적으로 프로젝트를 진행한다🤩
가제 Dangole
목표는 완성!