Coding/스파르타코딩클럽

[스파르타코딩클럽] Flask, API

폴밴 2022. 5. 26. 14:50

웹개발 과정의 4주차에서는 Flask 프레임워크를 이용해 API를 만들고 클라이언트와 연결하는 방법을 배웠다.

Flask로 서버를 만들때는 항상 static, templates(index.html), app.py를 세팅한다.
(venv는 가상환경 관련 폴더이므로 건드리지 않는다.)

1. API

클라이언트가 서버에 요청할 때, GET / POST 방식으로 할 수 있다.

@app.route('/test', methods=['GET'])
def test_get():
   title_receive = request.args.get('title_give')
   print(title_receive)
   return jsonify({'result':'success', 'msg': '이 요청은 GET!'})
@app.route('/test', methods=['POST'])
def test_post():
   title_receive = request.form['title_give']
   print(title_receive)
   return jsonify({'result':'success', 'msg': '이 요청은 POST!'})

Ajax로 HTML에서 요청을 확인할 수 있다.

$.ajax({
    type: "GET",
    url: "/test?title_give=봄날은간다",
    data: {},
    success: function(response){
       console.log(response)
    }
  })
$.ajax({
    type: "POST",
    url: "/test",
    data: { title_give:'봄날은간다' },
    success: function(response){
       console.log(response)
    }
  })

API를 설계할 때는

1. 클라이언트와 서버 확인하기
2. 서버부터 만들기
3. 클라이언트 만들기
4. 완성 확인하기

순으로 진행한다.

1. 클라이언트와 서버 확인하기

서버 코드 - app.py

## API 역할을 하는 부분
@app.route('/review', methods=['POST'])
def write_review():
	# 1. 클라이언트가 준 title, author, review 가져오기.
	# 2. DB에 정보 삽입하기
	# 3. 성공 여부 & 성공 메시지 반환하기
    return jsonify({'result': 'success', 'msg': '리뷰가 성공적으로 작성되었습니다.'})

클라이언트 코드 - index.html

function makeReview() {
		// 1. 제목, 저자, 리뷰 내용을 가져옵니다.
		// 2. 제목, 저자, 리뷰 중 하나라도 입력하지 않았을 경우 alert를 띄웁니다.
		// 3. POST /review 에 저장을 요청합니다.
    $.ajax({
        type: "POST",
        url:  "/review",
        data: { },
        success: function (response) {
            if (response["result"] == "success") {
                alert(response["msg"] );
                window.location.reload();
            }
        }
    })
}

2. 서버부터 만들기

클라이언트가 준 title, author, review를 가져오고 DB에 doc로 받아 저장하기

@app.route('/review', methods=['POST'])
def write_review():
    # title_receive로 클라이언트가 준 title 가져오기
    title_receive = request.form['title_give']
    # author_receive로 클라이언트가 준 author 가져오기
    author_receive = request.form['author_give']
    # review_receive로 클라이언트가 준 review 가져오기
    review_receive = request.form['review_give']

    # DB에 삽입할 review 만들기
    doc = {
        'title': title_receive,
        'author': author_receive,
        'review': review_receive
    }
    # reviews에 review 저장하기
    db.bookreview.insert_one(doc)
    # 성공 여부 & 성공 메시지 반환
    return jsonify({'msg': '리뷰가 성공적으로 작성되었습니다.'})

또는 DB에서 데이터 가져오기

@app.route('/review', methods=['GET'])
def read_reviews():
    # 1. DB에서 리뷰 정보 모두 가져오기
    reviews = list(db.bookreview.find({}, {'_id': False}))
    # 2. 성공 여부 & 리뷰 목록 반환하기
    return jsonify({'all_reviews': reviews})

3. 클라이언트 만들기

input 박스의 id 값을 이용해 입력되어 있는 값을 가져오고, data에 딕셔너리 형태로 저장해 요청한다.

function makeReview() {
    // 화면에 입력어 있는 제목, 저자, 리뷰 내용을 가져옵니다.
    let title = $("#title").val();
    let author = $("#author").val();
    let review = $("#bookReview").val();

    // POST /review 에 저장(Create)을 요청합니다.
    $.ajax({
        type: "POST",
        url: "/review",
        data: { title_give: title, author_give: author, review_give: review },
        success: function (response) {
            alert(response["msg"]);
            window.location.reload();
        }
    })
}

또는 DB에서 뽑아낸 데이터를 받아 나타내기

function showReview() {
                $.ajax({
                    type: "GET",
                    url: "/review",
                    data: {},
                    success: function (response) {
                        let reviews = response['all_reviews']
                        for (let i = 0; i < reviews.length; i++) {
                            let title = reviews[i]['title']
                            let author = reviews[i]['author']
                            let review = reviews[i]['review']

                            let temp_html = `<tr>
                                                <td>${title}</td>
                                                <td>${author}</td>
                                                <td>${review}</td>
                                            </tr>`
                            $('#reviews-box').append(temp_html)
                        }
                    }
                })
            }

4. 서버 연결 확인하기

 

이전 진도까지 배운 것들을 활용해 서버 부분과 클라이언트 부분을
모두 고려해 코드를 작성하다보니 헷갈리고 이해가 안되는 부분이 많았던 것 같다.

하지만 이렇게 개발일지를 쓰며 복습을 하고, 다시 한번 코드를 보니
전체적인 흐름에 대한 이해가 조금씩 더 되어가는 느낌이다. 

여러번 연습해서 익숙해지는 것이 필요할 것 같다.