본문 바로가기

꿀팁!

flask + rest api 공부

flask의 장점

  1. API Server를 가볍게 구현 할 수 있습니다.
  2. Docker나 Kubernetes를 이용해 여러 개의 컨테이너를 사용할때 용이 합니다.
  3. 일단 쉽고, 코드가 짧다.

설치

$ pip install flask
$ pip install flask-restx

테스트용 코드

from flask import Flask  # 서버 구현을 위한 Flask 객체 import
from flask_restx import Api, Resource  # Api 구현을 위한 Api 객체 import

app = Flask(__name__)  # Flask 객체 선언, 파라미터로 어플리케이션 패키지의 이름을 넣어줌.
api = Api(app)  # Flask 객체에 Api 객체 등록


@api.route('/hello')  # 데코레이터 이용, '/hello' 경로에 클래스 등록
class HelloWorld(Resource):
    def get(self):  # GET 요청시 리턴 값에 해당 하는 dict를 JSON 형태로 반환
        return {"hello": "world!"}

if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0', port=80)

https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo?hl=ko 

 

Advanced REST client

The web developers helper program to create and test custom HTTP requests.

chrome.google.com

Advanced REST client을 이용하면 테스트 하기 편해진다.

 

rest api

1. REST (Representational State Transfer)

웹에서 데이터를 전송 및 처리하는 방법을 정의한 인터페이스를 말한다.

모든 데이터 구조와 처리방식은 REST에서 URL을 통해 정의되며, 그래서 매우 직관적으로 이해할 수 있다.



일반적으로 API를 설계할때, URL로는 자원(resource)을 명시하고, HTTP Method로는 행위를 명시합니다.

 

REST 구성

  • 자원(resource): URI
  • 행위(verb): HTTP Method
    • HTTP Method를 통해 해당 자원에 대한 CRUD Operation을 적용하여 아래와 같이 사용한다.
      • Create: 데이터 생성 (POST)-DB로치면 insert문
      • Read: 데이터 조회 (GET)-DB로치면 select문
      • Update: 데이터 수정 (PUT)-DB로치면 update문
      • Delete: 데이터 삭제 (DELETE)-DB로치면 Delete문

 

from flask import Flask, request
from flask_restx import Resource, Api

app = Flask(__name__)
api = Api(app)

todos = {}
count = 1

@api.route('/todos')
class TodoPost(Resource):
    def post(self):
        global count
        global todos
        
        idx = count
        count += 1
        todos[idx] = request.json.get('data')
        
        return {
            'todo_id': idx,
            'data': todos[idx]
        }


@api.route('/todos/<int:todo_id>')
class TodoSimple(Resource):
    def get(self, todo_id):
        return {
            'todo_id': todo_id,
            'data': todos[todo_id]
        }

    def put(self, todo_id):
        todos[todo_id] = request.json.get('data')
        return {
            'todo_id': todo_id,
            'data': todos[todo_id]
        }
    
    def delete(self, todo_id):
        del todos[todo_id]
        return {
            "delete" : "success"
        }

if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0', port=80)

route의 url에 query string이 아닌 url pattern을 이용할 수 있다. (ex: /todos/<int:todo_id>)

url 자체에 변수를 삽입하는 방법으로 가능 하며, <타입명:변수명> 형태로 작성하면 된다. 그 변수는 class의 멤버 함수의 파라미터로 삽입하여 사용이 가능하다.

 

GET, POST, PUT, DELETE 방식을 처리하는 방법은 각각의 멤버 함수를 오버라이딩 하여 구현 해 주면 된다. 

body에 있는 데이터를 가져오려면 flask 모듈 내의 request 내의 json 객체를 이용하여, request body로 들어온 json값을 파싱하면 된다.

 

Advanced REST client을 이용해서 테스트 해보면

데이터를 삽입해주는 POST메소드를 이용해 body부분에 json으로 데이터를 만들어주고 전송하면된다.

 

데이터를 조회하는 get메소드를 이용해 조회, 숫자가 6인이유는 기존에 만들어둔 데이터가 있기때문이다. 소스상 count를 통해 숫자가 늘어나는 형식이므로 idx 2번부터 조회가 될것이다.

데이터를 수정하는 put메소드를 이용해 json형식으로 데이터를 변경해서 보내 값을 변경해준다.

get으로 조회해 데이터가 변경된것을 본 모습

delete도 그냥 url을 기반으로 삭제해주면된다.

'꿀팁!' 카테고리의 다른 글

github 사용법 정리-fork후 협업하기  (0) 2022.03.11
Flask-RESTX Swagger를 이용한 문서화  (0) 2022.02.28
Pandas를 이용한 데이터 정리  (0) 2022.02.03
ELK 공부 4  (2) 2022.01.24
ELK 공부3  (0) 2022.01.20