앞으로 만들 프로젝트의 구조다.
이 프로젝트는 ORM을 지원하는 SQLAlchemy를 사용한다. SQLAlchemy는 모델 기반으로 데이터 베이스를 처리하기 때문에 모델 클래스들을 정의할 파일이다.
웹 브라우저에서 서버로 전송된 폼을 처리할때 WTForms 라이브러리를 사용하는데 WTForms도 모델 기반으로 폼을 처리한다. 폼 클래스를 정의할 파일이다.
화면 구성 함수들을 저장한다. 기능에따라 여러가지 뷰 파일을 만든다.
CSS, Javascript, image 파일을 저장한다.
여러가지 .html 템플릿 파일을 저장한다.
환경변수, 데이터베이스 등의 설정을 저장할 파일이다.
app = Flask(__name__)
위처럼 언더바 그대로 표시 하고싶을땐 앞에 \를 넣어주면 된다. (마크다운)
FLASK는 app 객체를 사용해 여러 가지 설정을 진행한다. 하지만 app 객체를 전역으로 사용할 때, 프로젝트 규모가 커질수록 오류가 발생할 확률이 올라간다.
대표적인 오류는 순환참조인데, 참조하는 대상이 서로 물려 있어서 참조할 수 없게 되는 현상을 말한다.
순환참조 예시) Excel
A1은 계산을 위해 B1을 참조하고, B1도 계산을 위해 A1을 참조하는 상황이다. 서로 계속 참조하다보면 끝이 없기때문에 오류가 발생한다.
그래서, FLASK 공식 홈페이지는 애플리케이션 팩토리(application factory)를 사용하라고 권장한다. 애플리케이션 팩토리는 app 객체를 생성하는 함수를 의미 한다.
책 내용을 원활하게 진행하기 위해 이전에 만든 HelloWorld.py 제목을 pybo.py로 변경해주고 진행했다.
(myproject) c:\projects\myproject> mkdir pybo
(myproject) c:\projects\myproject> move pybo.py pybo/__init__.py
pybo 디렉토리를 만들어주고 pybo.py 파일을 __init__.py로 대체하여 pybo 디렉토리로 옮겼다.
이전에 기본 앱을 FLASK_APP=pybo로 설정했기 때문에 pybo모듈을 가르킨다. pybo/__init__.py가 오류 없이 동작하는것을 볼 수 있다.
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_app 함수가 애플리케이션 팩토리다.
(함수명 create_app은 FLASK 내부에서 정의된 함수명이다. 다른 이름을 사용하면 정상 동작하지않는다.)
위와 같이 코드 수정 후에도 잘 작동 하는 것을 볼 수 있다.