본문 바로가기
Study/Flask

Flask NameSpace 적용하기

by Zeromk2 2022. 6. 19.
728x90

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

 가 됩니다.

댓글