より大きなアプリケーション Larger Applications

以下のような、flaskアプリケーションのシンプルな構造を想像してください: Imagine a simple flask application structure that looks like this::

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

これは小さなアプリケーションではよいですが、より大きなアプリケーションではモジュールの代わりにパッケージを使うのがよい考えです。チュートリアルではパッケージのパターンを使っていますので、コード例を確認してください。 While this is fine for small applications, for larger applications it's a good idea to use a package instead of a module. The :ref:`tutorial <tutorial>` is structured to use the package pattern, see the :gh:`example code <examples/tutorial>`.

シンプルなパッケージ Simple Packages

これをより大きなものへ変換するために、まずは既にあるフォルダの中に新しくyourapplicationフォルダを作成し、全てをそのフォルダの下へ移動します。それからyourapplication.pyのファイル名を__init__.pyへ変更します。(最初に全ての.pycファイルを確実に削除してください。そうしないと、うまくいかない場合が多いでしょう) To convert that into a larger one, just create a new folder :file:`yourapplication` inside the existing one and move everything below it. Then rename :file:`yourapplication.py` to :file:`__init__.py`. (Make sure to delete all ``.pyc`` files first, otherwise things would most likely break)

そうすると、以下のようになるはずです: You should then end up with something like that::

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

しかし、アプリケーションはどうやって実行するのでしょうか?素朴なpython yourapplication/__init__.pyではうまくいきません。Pythonはパッケージの中のモジュールを開始時の実行ファイル(startup file)にはしたがらないとだけ言わせてください。しかし、それは大きな問題ではなく、setup.pyと呼ばれる新しいファイルを内側のyourapplicationフォルダ(訳注: 上の例で「yourapplication」フォルダが2つあるうちの内側の方)の隣に、以下の内容でただ追加だけしてください: But how do you run your application now? The naive ``python yourapplication/__init__.py`` will not work. Let's just say that Python does not want modules in packages to be the startup file. But that is not a big problem, just add a new file called :file:`setup.py` next to the inner :file:`yourapplication` folder with the following contents::

from setuptools import setup

setup(
    name='yourapplication',
    packages=['yourapplication'],
    include_package_data=True,
    install_requires=[
        'flask',
    ],
)

アプリケーションを実行するためには、アプリケーションのインスタンスをどこで見つけられるかFlaskへ伝える環境変数をexportする必要があります: In order to run the application you need to export an environment variable that tells Flask where to find the application instance::

$ export FLASK_APP=yourapplication

もしプロジェクトのディレクトリの外側に居る場合は、自分のプロジェクトのディレクトリへのパスを正確に提供するよう確実にしてください。同様に、以下のようにして開発機能(development features)を有効にできます: If you are outside of the project directory make sure to provide the exact path to your application directory. Similarly you can turn on the development features like this::

$ export FLASK_ENV=development

アプリケーションをインストールして実行するためには、以下のコマンドを発行する必要があります: In order to install and run the application you need to issue the following commands::

$ pip install -e .
$ flask run

ここから何が得られたのでしょうか?ここまでで、複数のモジュールへと多少アプリケーションを再構成できます。ただひとつ覚えておく必要があることは、以下の手短なチェックリストです: What did we gain from this? Now we can restructure the application a bit into multiple modules. The only thing you have to remember is the following quick checklist:

  1. Flaskアプリケーションのオブジェクトの作成は、__init__.pyファイルの中で行う必要があります。そのようにすると、各モジュールがFlaskアプリケーションのオブジェクトを安全にimportし、__name__変数で適切なパッケージが分かるようにできます。 the `Flask` application object creation has to be in the :file:`__init__.py` file. That way each module can import it safely and the `__name__` variable will resolve to the correct package.

  2. すべてのview関数(route()デコレータが関数名の上にあるもの)は、__init__.pyファイルの中でimportされる必要があります。(importするのは)オブジェクト(訳注: おそらくview関数のこと)自身ではなく、それ(訳注: 直前に書いてある「オブジェクト」のこと)があるモジュールです。viewのモジュールはアプリケーションのオブジェクトが作成された後でimportします。 all the view functions (the ones with a :meth:`~flask.Flask.route` decorator on top) have to be imported in the :file:`__init__.py` file. Not the object itself, but the module it is in. Import the view module **after the application object is created**.

__init__.pyの例がこちらです: Here's an example :file:`__init__.py`::

from flask import Flask
app = Flask(__name__)

import yourapplication.views

そしてこれは、views.pyがどのようになるか示しています: And this is what :file:`views.py` would look like::

from yourapplication import app

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

そうすると、以下のようになるはずです: You should then end up with something like that::

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

循環import(Circular Imports) Circular Imports

全てのPythonプログラマが嫌っており、我々もいくらかそれに加わるものがこちらです: 循環import(2つのモジュールがお互い依存し合うとき循環importになります。今回の場合では、views.py__init__.pyに依存しています)。一般的には循環importは悪いアイデアですが、今回のは実際に大丈夫だとお知らせします。その理由は、__init__.pyの中ではviewを実際には使わないようにし、確実にモジュールはimportされるようにし、そしてそのimportをファイルの最後で行うようにしているためです。 Every Python programmer hates them, and yet we just added some: circular imports (That's when two modules depend on each other. In this case :file:`views.py` depends on :file:`__init__.py`). Be advised that this is a bad idea in general but here it is actually fine. The reason for this is that we are not actually using the views in :file:`__init__.py` and just ensuring the module is imported and we are doing that at the bottom of the file.

まだいくつかの問題がこのアプローチでも残りますが、もしデコレータを使いたい場合は避けようがありません。この問題をどのように扱うかに関する、いくらかのひらめきが欲しいときは、巨大化(Becoming Big)をチェックしてください。 There are still some problems with that approach but if you want to use decorators there is no way around that. Check out the :ref:`becomingbig` section for some inspiration how to deal with that.

Blueprintsを使った対応 Working with Blueprints

もしも大きなアプリケーションがあるときは、小さなグループへ分割し、blueprintの助けを使って各グループを実装することが推奨されます。この話題に対する穏やかな導入説明についてはBlueprintを使ったアプリケーションのモジュール化の章のドキュメントを参照してください。 If you have larger applications it's recommended to divide them into smaller groups where each group is implemented with the help of a blueprint. For a gentle introduction into this topic refer to the :ref:`blueprints` chapter of the documentation.