[python 인터넷] Flask로 REST API 구현하기 - 1. Flask-RESTX

이번 시간에는 Flask로 간단히 REST API를 주고 받는 API Server를 만들어 보겠습니다.

Flask란?

Flask는 Python 기반의 Micro Web Framework 입니다. 배우기 쉽고, 간단한 코드 구현과 자유도가 높다는 점이 장점입니다.

자유도가 높은 만큼, 간단한 코드 구현을 권장합니다.

 

왜 Flask로 API Server를 구현하나요?

Flask는 현실적으로 서버의 Application단을 구현 한다기 보단 API Server의 역할을 더 많이 합니다. 애초에 이 친구는 Micro Web Framework 입니다. 미니멀리즘을 표방하고 나온 친구죠. 그래서 사람들이 Flask로 API Server를 구현 하고, 이를 Docker나 Kubernetes를 이용해 스케쥴링을 하며 서버 자원을 유연하게 활용 하는 경우가 많습니다.

즉, 요약해보면 장점은 세 가지 입니다.

  1. API Server를 가볍게 구현 할 수 있습니다.
  2. Docker나 Kubernetes를 이용해 여러 개의 컨테이너를 이용하여 스케쥴링이 용이 합니다.
  3. 일단 쉽고, 코드가 짧습니다. (매우 중요)

Installation

flask와 Flask의 Extension인 flask-restx pip을 이용하여 설치합니다.

$ pip install flask
$ pip install flask-restx

첫 번째 Flask Server

다음 코드를 통해서 첫 번째 Flask Server를 만들어 보겠습니다.

app.py

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)

그 다음 터미널에서 실행시켜 봅니다.

python app.py

그리고 'http://localhost/hello' 에 들어가 봅시다. 저는 구글 크롬의 확장 앱인, Advanced REST client를 이용하여 테스트 했습니다.

실행 결과는 다음과 같습니다. (저 같은 경우는 구름 IDE 환경에서 실행하여, 구름 IDE에서 제공하는 도메인으로 서버에 접속 하였습니다.)

정상적으로 API 요청이 된 모습.

 

다양한 Resourceful Routing

route의 url에 query string이 아닌 url pattern을 이용할 수 있습니다. url 자체에 변수를 삽입하는 방법으로 가능 하며, <타입명:변수명> 형태로 작성하면 됩니다. 그 변수는 class의 멤버 함수의 파라미터로 삽입하여 사용 합니다.

app.py

from flask import Flask
from flask_restx import Resource, Api

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


@api.route('/hello/<string:name>')  # url pattern으로 name 설정
class Hello(Resource):
    def get(self, name):  # 멤버 함수의 파라미터로 name 설정
        return {"message" : "Welcome, %s!" % name}
    
if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0', port=80)

url pattern으로 파라미터를 인식, 값이 잘 들어간 것을 볼 수 있습니다.

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

 

Status Code와 Header 설정

반환 하고자 하는 리턴 값으로 iterable 하게 값을 넣으면 됩니다. 순서는 다음과 같습니다.

  1. 반환 하고자 하는 dict 객체
  2. 반환 하고자 하는 Status Code
  3. 반환 하고자 하는 Header

app.py

from flask import Flask
from flask_restx import Resource, Api

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


@api.route('/hello/<string:name>')
class Hello(Resource):
    def get(self, name):
        return {"message" : "Welcome, %s!" % name}
    
if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0', port=80)

Status Code와 Header값이 잘 들어간 것을 확인 할 수 있습니다.

 

GET, POST, PUT, DELETE

GET, POST, PUT, DELETE 방식을 처리하는 방법은 단순합니다. getpostputdelete 멤버 함수를 오버라이딩 하여 구현 해 주면 됩니다. body에 있는 데이터를 가져오기 위해서, 취하는 방법은 간단합니다. flask 모듈 내의 request 내의 json 객체를 이용하여, request body로 들어온 json값을 파싱하면 됩니다. json 객체는 dict 객체 입니다.

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)

POST 요청

 

GET 요청

 

PUT 요청

 

마치며

만약 우리가 한 10개 이상의 REST API를 구현 해야 한다면 어떻게 해야 할까요? 파일 분리는? API의 문서화는? 상당히 피곤 한 주제이지만, Flask-RESTX로 쉽게 해결 할 수 있습니다. 다음 시간에는 파일 분리와, 문서화에 대해서 알아 보도록 하겠습니다!

 

[출처] https://justkode.kr/python/flask-restapi-1

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
15 [python 데이터분석] [jupyter] 주피터 노트북에 이미지 삽입 file 졸리운_곰 2025.09.06 524
14 [python 데이터분석] [Python] Streamlit 사용법 (python 데이터분석 웹 만들기) file 졸리운_곰 2024.12.22 462
13 [python 데이터분석] Anaconda : Error while loading conda entry point: conda-libmamba-solver (libarchive.so.19: cannot open shared object file: No such file or directory) 졸리운_곰 2024.12.14 520
12 [python 데이터분석] Anaconda | Conda update 반영 안됨(update 후에도 버전 변경 없음) file 졸리운_곰 2024.11.18 431
11 [python 데이터분석] Keeping Anaconda Up To Date 졸리운_곰 2024.05.30 552
10 [python 데이터 분석] 국내 경제 100대 통계지표 졸리운_곰 2024.02.18 672
9 [python 데이터 분석] Python 에서 R언어 패키지 호출 : Calling R From Python With rpy2 file 졸리운_곰 2024.01.28 676
8 [python 데이터 분석] 파이썬을 활용한 코스피, 달러 환율정보 수집부터 차트 시각화까지 file 졸리운_곰 2023.12.11 735
7 [Python 데이터분석][pandas] [Python pandas] DataFrame의 문자열 칼럼을 숫자형으로 바꾸기 : pd.to_numeric(), DataFrame.astype() file 졸리운_곰 2023.12.09 357
6 [Python 데이터분석] [Python 환경설정] VS code 설치 및 Anaconda와 연동하기 file 졸리운_곰 2023.03.17 527
5 [Python 데이터분석][python 데이터분석 프로덕션] [Python] Docker를 사용한 Dash 웹앱 생성 file 졸리운_곰 2021.12.10 403
4 [Python 데이터분석] [pandas] 공공데이터(csv) 활용시 한글 깨짐 현상 해결 file 졸리운_곰 2021.09.30 592
3 [Python 데이터분석] 공공데이터포털::공휴일 데이터 조회 (REST API) file 졸리운_곰 2021.09.30 358
2 [Python 데이터 분석] pandas의 to_csv()를 사용해서 csv 파일로 저장하기(save 하기) 졸리운_곰 2021.09.29 603
1 [Python 데이터 분석] 데이터 과학을 단순하게 만드는 3가지 Python 패키지 file 졸리운_곰 2021.09.24 513
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED