반응형

플라스크 애플리케이션 팩토리

 

가상 환경을 만들고 플라스크 프로젝트를 생성하고 실습해보는 것을 연습한 포스팅(https://psleon.tistory.com/147)에서는 플라스크 앱을 간단히 알아보았다.

app = Flask(__name__)

플라스크 앱은 위 코드에서 보듯 Flask 클래스로 만든 객체를 말한다.

플라스크는 app 객체를 사용해 여러 가지 설정을 진행하는데 이와 같은 방식으로 app 객체를 전역으로 사용하면 프로젝트 규모가 커질수록 순환 참조(circular import) 오류와 같은 문제가 발생할 확률이 높아진다.

 

* 순환 참조: A 모듈이 B 모듈을 참조하고 B 모듈이 다시 A 모듈을 참조하는 경우

 

애플리케이션 팩토리 사용하기

위에서 설명한 app 객체를 전역으로 사용할 때 발생할 수 있는 문제를 예방하기 위해서는 플라스크 공식 홈페이지에서 권하는 '애플리케이션 팩토리(application factory)'를 사용해야 한다. 애플리케이션 팩토리는 app 객체를 생성하는 함수이다.

 

1단계. pybo.py를 __init__.py 파일로 변경하기

먼저 projects/myproject/ 디렉터리에서 pybo 라는 디렉터리를 새롭게 생성한다.

 

그리고 projects/myproject/ 디렉터리에 있는 pybo.py 파일을 projects/myproject/pybo/ 디렉터리로 옮기고 파일명을 __init__.py로 바꾼다.

 

그 후 control + C를 눌러 플라스크 서버를 종료하고 다시 플라스크 서버를 실행해 보자.

그러면 이전과 같이 똑같이 잘 실행되는 것을 확인할 수 있다.

필자는 플라스크 기본 앱을 export FLASK_APP=pybo.py 로 설정했다. 따라서 이전에 pybo는 프로젝트 루트에 있는 pybo.py를 가리켰지만, 이번에는 pybo/__init__.py 파일을 가리킨다. 따라서 pybo.py 파일을 pybo/__init__.py 파일로 바꾸었으나 오류 없이 정상적으로 실행된다.

 

2단계. 애플리케이션 팩토리 사용하기

__init__.py 파일을 열고 create_app 함수를 선언하는 방식으로 코드를 아래와 같이 수정하자.

from flask import Flask

def create_app():
    app = Flask(__name__)
    @app.route('/')
    def hello_pybo():
        return 'Hello, pybo!'
    return app

create_app() 함수가 app 객체를 생성해 반환하도록 코드를 수정했다.

이때 app 객체가 함수 안에서 사용되므로 hello_pybo() 함수를 create_app() 함수 안에 포함했다.

여기서 사용된 create() 함수를 바로 '애플리케이션 팩토리'라고 한다.

 

이제 잘 실행되는지 한번 더 터미널에서 플라스크 서버를 종료한 후 다시 실행시킨 후 웹 브라우저로 접속해보자.

오류 없이 잘 실행된다는 것을 확인할 수 있다.