Flask with REST API

s2ul3·2022년 10월 10일
0
post-thumbnail

API (Application Programming Interface)

API : 프로그램들이 서로 상호작용하는 것을 도와주는 매개체

REST(Representational State Trnasfer)

  • 웹 서버가 요청을 응답하는 방법 중 하나
  • 데이터가 아닌, 자원(Resource)의 관점으로 접근

REST API

HTTP URI를 통해 자원을 명시하고
HTTP Method를 통해 해당 자원에 대한 CRUD를 진행

  • HTTP URI : 웹에서 정보를 요청할 때 대상 위치를 나타내는 identifier
    ex) URL
  • HTTP Method : 웹에 정보를 요청하는 방법
    ex) GET, POST, PUT

REST API Example

REST API의 Stateless(무상태성)

Clint의 context를 Server에서 유지하지 않는다. (clinet들이 요청한 결과로 모두 동일해야함.)
ex)
POST/shoes : 자원(shoes)에 새로운 정보를 생성
GET/shoes : DB에서 shoes가 있는지 확인 후 해당 자원 반환
(서버 입장에서) 아이템을 GET하기 위해 POST를 진행할 필요 없음!

Coffee shop Menu API 구축해보자.

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!'

1. GET

# GET /menus : menus 자료를 가지고 온다.
@app.route('/menus') # methods의 기본값은 GET이므로 methods =['GET']을 쓸 필요 없음.
def get_menus():
	# menus는 list타입인데, list 타입의 경우 json으로 변환 불가능 
    # --> menus를 value로 하는 딕셔너리를 만들어서 json 타입으로 변환한다.
    return jsonify({'menus' : menus}) 

2. POST

# 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)

3. PUT

# 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)

4. DELETE

# 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 : Postman을 통해 API를 테스트 할 수 있다.

postman 다운받기 : https://www.postman.com/downloads/

링크 : http://127.0.0.1:5000

1.GET method

1-1. root 정보 GET

1-2. menus 정보 GET

2. POST method

  • 새로운 정보를 menus에 post
  • 이때 새로운 정보는 http request의 Body에 json형태로 다음과 같이 요청을 작성.

    --> 그 결과, 아래 사진처럼 새로운 정보가 잘 추가된 것을 확인할 수 있다.

3. PUT method

id가 1번인 menu의 가격을 3000원으로 업데이트하자.

--> 그 결과 아래 사진처럼 1번 메뉴의 가격이 바뀌었다.

4. DELETE method

4번메뉴를 삭제해보자.

--> 그 결과 아래 사진처럼 4번 메뉴가 삭제되었다.

❓But : server를 껐다 키면 정보가 사라짐.--> DB가 필요함. --> Flask와 DB연동은 어떻게 할까?❓

profile
statistics & computer science

0개의 댓글