Flask Flask-Classful을 이용한 REST API 적용
REST API를 적용하기 위해 아래 python package를 설치합니다. (작성일 기준 0.14.2 버전 입니다.)
(venv) > pip install flask_classful
그리고 아래 코드를 작성합니다.
소스코드
# app/__init__.py
from flask import Flask
app = Flask(__name__)
# run.py
import os
from typing import NoReturn, Any
from flask import url_for, request
from app import app
from app.controller import base_controller
from app.controller import post_controller
class Server(object):
def __init__(self, host: str, port: int, debug: bool, use_reloader: bool, threaded: bool):
self.host = host
self.port = int(os.environ.get("PORT", port))
self.debug = debug
self.use_reloader = use_reloader
self.threaded = threaded
@staticmethod
def register_views() -> NoReturn:
base_controller.BaseView.register(app, route_base='/')
post_controller.PostView.register(app, route_base='/post')
@staticmethod
def url_for_other_page(page) -> Any:
args = request.view_args.copy()
args['page'] = page
return url_for(request.endpoint, **args)
def run(self) -> NoReturn:
self.register_views()
app.jinja_env.globals['url_for_other_page'] = self.url_for_other_page
app.run(host=self.host, port=self.port, debug=self.debug,
use_reloader=self.use_reloader, threaded=self.threaded)
if __name__ == '__main__':
server = Server(host='127.0.0.1', port=5000, debug=True, use_reloader=False, threaded=True)
server.run()
# app/controller/base_controller.py
from flask import jsonify
from flask_classful import FlaskView
class BaseView(FlaskView):
def __init__(self):
pass
def index(self):
return jsonify(text='index page', success=200)
# app/controller/post_controller.py
from flask import jsonify
from flask_classful import FlaskView
from flask_classful import request
class PostView(FlaskView):
def __init__(self):
pass
def get(self, id: int):
test_data = {
1: { 'name': 'Hong Gil-dong' }
}
data = test_data[id]
return jsonify(data=data, success=True)
def post(self):
json_data = request.json
name = json_data.get('form-name')
print('name: ', name)
return jsonify(success=True)
결과화면
index
get
post
코드설명
위 예제는 index, GET, POST만 사용했습니다.
flask_classful 자체에서 get, post를 지원하기 때문에 route method를 잡아주지 않아도 GET, POST 동작으로 사용이 가능합니다.
기존의 Flask 코드와 다른 점은 아래와 같이 route를 잡아준다는 점,
base_controller.BaseView.register(app, route_base='/')
post_controller.PostView.register(app, route_base='/post')
그리고 Controller에 FlaskView를 사용한다는 점입니다.
REST API를 사용하면 Resource 관리에 유용하기 때문에 꼭 알아둘 필요가 있습니다.
댓글남기기