dor.gg
[python] flask application factory
leui
2022. 2. 9. 15:59
flask 애플리케이션 팩토리 패턴을 알아보자.
app=Flask(__name__)을 전역으로 사용하다 보면 여러 가지 오류가 생길 수도 있는데 대표적으로 순환 참조가 있다.
이 문제를 애플리케이션 팩토리 패턴을 통해 해결할 수 있다.
폴더 구조
FlaskStudy
ㄴapp
ㄴ__init__.py
ㄴrun.py
app 폴더 아래에 __init__. py를 생성해 준다. (__init__.py는 app 폴더를 모듈로 만들어 준다)
__init__.py
from flask import Flask
def create_app():
app = Flask(__name__)
@app.route('/')
def index():
return "hello!!!"
return app
이전 게시물과 큰 차이 없이 create_app()이라는 함수 안에 app을 넣어주고 app을 반환해주는 방식이다.
이전 게시물과 같이 터미널에 set FLASK_APP=app으로 설정해주시고 flask run 명령어를 입력하면 서버가 열린다.
혹은 python 명령어로 서버를 실행시킨다면 run.py 파일을 생성하고 run.py에 create_app을 가져와 실행시키면 된다.
from app import create_app
if __name__ == '__main__':
app = create_app()
app.run()

+ 팩토리 패턴에서 다른 객체 생성 __init__. py
이후에 db객체나 jwt객체를 생성할 때 app객체를 사용해서 생성한다. 이때 create_app() 함수 위에 다른 객체를 전역 변수로 선언해 주고 create_app() 함수 안에서 객체를 초기화시키면 다른 파일에서 db나 jwt를 참조할 때 순환 참조 오류를 예방할 수 있다.
from flask import Flask
db = "SQLAlchemy()"
jwt = "JWTManager()"
def create_app():
app = Flask(__name__)
db.init_app(app)
jwt.init_app(app)
@app.route('/')
def index():
return "hello!!!"
return app
예를 들어 db객체와 jwt객체를 각각 생성해 놓고 create_app() 안에서 초기화를 해주는 패턴이다.
다음에는 블루프린트를 이용해 라우트를 확장시켜보자.