Study/Flask

Flask NameSpace 적용하기

Zeromk2 2022. 6. 19. 07:31

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