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() 안에서 초기화를 해주는 패턴이다.

 

다음에는 블루프린트를 이용해 라우트를 확장시켜보자.