[완성 소스]
: github.com/pahkey/jump2flask/tree/2-02[실습 영상]
: https://youtu.be/fQuqpduKtSw
1장에서 플라스크 앱을 간단히 알아보았다. 실제로 플라스크 앱은 다음 코드에서 보듯 Flask 클래스로 만든 객체를 말한다.
app = Flask(__name__)
플라스크는 app 객체를 사용해 여러 가지 설정을 진행한다. 그런데 이와 같은 방식으로 app 객체를 전역으로 사용하면 프로젝트 규모가 커질수록 문제가 발생할 확률이 높아진다. 순환 참조(circular import) 오류가 대표적이다.
순환 참조란 A 모듈이 B 모듈을 참조하고 B 모듈이 다시 A 모듈을 참조하는 경우를 말한다.
app 객체를 전역으로 사용할 때 발생하는 문제를 예방하려면 어떻게 해야 할까? 플라스크 공식 홈페이지에서는 "애플리케이션 팩토리(application factory)를 사용하라"고 권한다.
이번 장에서는 애플리케이션 팩토리에 대해서 알아보자.
pybo.py를 __init__.py 파일로 변경하기
앞에서 만든 myproject/pybo.py
파일을 myproject/pybo/__init__.py
파일로 바꾸어 보자. 먼저 명령 프롬프트에서 다음 명령으로 myproject/pybo
디렉터리를 만든다.
(myproject) c:\projects\myproject> mkdir pybo
그리고 move 명령어로 pybo.py 파일을 pybo/__init__.py
파일로 이동하자.
(myproject) c:\projects\myproject> [[MARK]]move pybo.py pybo/__init__.py[[/MARK]]
1개 파일을 이동했습니다.
맥 OS의 경우 move 대신 mv 명령을 사용하자.
그리고 플라스크 서버를 실행해 보자.
(myproject) c:\projects\myproject>[[MARK]]flask run[[/MARK]]
* Serving Flask app "pybo" (lazy loading)
* Environment: development
* Debug mode: on
* Restarting with stat
* Debugger is active!
* Debugger PIN: 202-513-618
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
[중요]!! flask run 명령은 반드시 프로젝트 홈 디렉터리(
C:/projects/myproject
)에서 실행해야한다. 다른 곳에서 실행하면 실행은 되지만 정상으로 동작하지 않는다. 앞으로도flask run
으로 플라스크 서버를 실행할 때는 위치를 꼭 확인하자.
파일명을 바꾸어도 플라스크 서버가 잘 실행된다. 우리는 플라스크 기본 앱을 FLASK_APP=pybo
로 설정했다. 따라서 이전에 pybo는 프로젝트 루트에 있는 pybo.py 파일을 가리켰지만, 이번에는 pybo 모듈 즉 pybo/__init__.py
파일을 가리킨다.
pybo.py
와pybo/__init__.py
는 동일한 pybo 모듈이다.
따라서 pybo.py 파일을 pybo/__init__.py
파일로 바꾸어도 오류없이 잘 동작한다.
애플리케이션 팩토리
__init__.py
파일을 열고 create_app 함수를 선언하는 방식으로 코드를 수정하자.
[파일명: projects\myproject\pybo\__init__.py]
from flask import Flask
[[MARK]]def create_app():
app = Flask(__name__)
@app.route('/')
def hello_pybo():
return 'Hello, Pybo!'
return app[[/MARK]]
create_app 함수가 app 객체를 생성해 반환하도록 코드를 수정했다. 이때 app 객체가 함수 안에서 사용되므로 hello_pybo 함수를 create_app 함수 안에 포함했다. 바로 여기서 사용된 create_app 함수가 바로 애플리케이션 팩토리다.
함수명으로 create_app 대신 다른 이름을 사용하면 정상으로 동작하지 않는다. create_app은 플라스크 내부에서 정의된 함수명이다.
코드를 수정한 후 플라스크 서버를 다시 시작하면 오류 없이 잘 실행된다.