더 큰 어플케이션들

더 큰 어플리케이션들의 경우, 모듈 대신 패키지를 사용하는게 좋다.패키지의 사용은 꽤 간단하다.작은 어플리케이션은 아래와 같은 구조로 되어있다고 생각해보자:

/yourapplication
    /yourapplication.py
    /static
        /style.css
    /templates
        layout.html
        index.html
        login.html
        ...

간단한 패키지

작은 어플리케이션을 큰 어플리케이션 구조로 변환하기 위해, 단지 기존에 존재하던 폴더에 새 폴더 yourapplication 를 생성하고 그 폴더로 모두 옯긴다. 그리고 나서, yourapplication.py__init__.py 으로 이름을 바꾼다. (먼저 모든 .pyc 을 삭제해야지, 그렇지 않으면 모든 파일이 깨질 가능성이 크다.)

여러분은 아래와 같은 구조를 최종적으로 보게 될 것이다:

/yourapplication
    /yourapplication
        /__init__.py
        /static
            /style.css
        /templates
            layout.html
            index.html
            login.html
            ...

하지만 이 상황에서 여러분은 어떻게 어플리케이션을 실행하는가? python yourapplication/__init__.py 와 같은 순진한 명령은 실행되지 않을 것이다.

파이썬은 패키지에 있는 모듈이 스타트업 파일이 되는 것을 원하지 않는다고 해보자. 하지만, 그것은 큰 문제는 아니고, 아래와 같이 단지 runserver.py 라는 새 파일을 루트 폴더 바로 아래 있는 yourapplication 폴더 안에 추가하기만 하면 된다:

from yourapplication import app
app.run(debug=True)

이렇게해서 우리는 무엇을 얻었는가? 이제 우리는 이 어플리케이션을 복개의 모듈들로 재구조화할 수 있다. 여러분이 기억해야할 유일한 것은 다음의 체크리스트이다:

  1. 플라스크 어플리케이션 객체 생성은 __init__.py 파일에서 해야한다. 그런 방식으로 개별 모듈은 안전하게 포함되고 __name__ 변수는 알맞은 패키지로 해석될 것이다.
  2. 모든 뷰 함수들은(함수의 선언부 위에 route() 데코레이터(decorator)를 가진 함수)는 __init__.py 파일에 임포트되어야 하는데, 객체가 아닌 함수가 있는 모듈을 임포트해야한다. 어플리케이션 객체를 생성한 후에 뷰 모듈을 임포트해라.

여기에 __init__.py 파일의 예제가 있다:

from flask import Flask
app = Flask(__name__)

import yourapplication.views

그리고 아래가 views.py 파일의 예제일 수 있다:

from yourapplication import app

@app.route('/')
def index():
    return 'Hello World!'

여러분은 최종적으로 아래와 같은 구조를 얻을 것이다:

/yourapplication
    /runserver.py
    /yourapplication
        /__init__.py
        /views.py
        /static
            /style.css
        /templates
            layout.html
            index.html
            login.html
            ...

순환 임포트(Circular Imports)

모든 파이썬 프로그래머는 순환 임포트를 싫어하지만, 우리는 일부 그것을 더했다: 순환 임포트는(두 모듈이 서로 의존 관계가 있는 경우이다. 위 경우 views.py__init__.py 에 의존한다). Be advised that this is a bad idea in general but here it is actually fine. 이런 방식은 일반적으로 나쁘지만, 이 경우는 실제로 괜찮다고 생각해도 된다. 왜냐하면 `__init__.py`에 있는 뷰들을 실제로 사용하지 않고 단지 모듈들이 임포트되었는지 보장하고 그 파일의 제일 하단에서 임포트하기 때문이다.

이런 접근법에도 일부 문제가 남아있지만 여러분이 데코레이터(decoroator)를 사용하고 싶다면 문제를 피할 방도는 없다. 그것을 다루는 방법에 대한 몇 가지 영감을 위해 크게 만들기 단락을 확인해라

청사진(Blueprints)으로 작업하기

여러분이 더 큰 규모의 어플리케이션을 갖고 있다면, 그것들을 청사진으로 구현된 더 작은 그룹으로 나누는 것을 추천한다. 이 주제에 대한 가벼운 소개는 이 문서의 블루프린트를 가진 모듈화된 어플리케이션 장을 참고해라.