API 서버로 Flask를 운영중인데 사용하는 API가 늘어날 수록 실행 파일의 길이가 계속 길어지는 문제가 있었습니다.
이런 문제를 해결하기 위해 NameSpace라는 것을 사용할 수 있습니다.
NamaSpace의 역할은 실제 구동되는 코드를 Flask 실행 파일 단에 두지 않고 첨부하여 사용하게 되는 방식입니다.
이렇게 할 경우 1줄만으로 API를 사용할 수 있게 되어 Flask 실행 파일의 길이를 획기적으로 줄일 수 있게 됩니다.
매인 실행 파일인 app.py와 api 코드가 있는 util_api.py 파일이 있다고 가정하겠습니다.
app.py
from flask import Flask
from flask_restx import api, Resource
from util_api import GetJson
app = Flask(__name__)
api = Api(app)
api.route(/jsondata)
class JsonData(Resource):
def get(self):
json_data = GetJson.get(self)
return json_data
if __name__ = "__main__":
app.run(debug=True, host="0.0.0.0", port=5000)
util_api.py
import json
from flask import request
class GetJson():
def get(self):
with open("test.json", "r") as json_file:
json_data = json.load(json_file)
return json_data
이제 util_api.py 파일에 app.py에서 사용했던 flask_restx 관련 Resource 클래스를 import 해줍니다.
그리고 Namespace를 추가로 import 합니다.
변경된 util_api.py
import json
from flask import request
# flask_restx 관련 class import
from flask_restx import Resource, Namespace
# namespace 설정 추가
getjson_namespace = Namespace('getjson')
# namespace 객체 함수명으로 route
# 매개변수로 Resource 추가
@getjson_namespace.route('/jsondata')
class GetJson(Resource):
def get(self):
with open("test.json", "r") as json_file:
json_data = json.load(json_file)
return json_data
이제 app.py에서 선언된 namespace를 가져와서 사용합니다.
변경된 app.py
from flask import Flask
from flask_restx import api, Resource
# class 명이 아닌 namespace 객체를 import 합니다
from util_api import getjson_namespace
app = Flask(__name__)
api = Api(app)
# 이곳에서 api.route(/jsondata) 하지 않습니다.
# add_namaspace로 추가합니다.
api.add_namespace(getjson_namespace, '/qa')
if __name__ = "__main__":
app.run(debug=True, host="0.0.0.0", port=5000)
보시면 app.py와 util_api.py에 모두 path(endpoint) 가 있는 것을 보실 수 있는데 이건
namespace를 불러오는 곳의 경로와 namespace가 지정된 곳의 경로가 합쳐져서 사용되게 됩니다.
그럼 app.py의 add_namespace에 있는 경로인
/qa
util_api.py의 route에 있는 경로인
/jsondata
가 합쳐져서
해당 API의 endpoint는
/qa/jsondata
가 됩니다.
728x90
댓글