あなたがこれから開発するアプリケーションは恐らく多くのソフトウェアに依存するはずです。 少なくともFlaskパッケージに依存していなければ、あなたは誤った本を読んでいる可能性があります。 アプリケーションの環境とは、それを実行するのに必要となるファイルのことです。 幸いなことに簡単に環境を構築するためのいくつかの方法があります。
virtualenvはアプリケーションを仮想環境で分離して動作させるためのツールです。 仮想環境とはアプリケーションが依存するソフトウェアを格納したディレクトリのことです。 仮想環境は環境変数を利用して切り替えを行います。 virtualenvではPythonのパッケージをシステムディレクトリやユーザーディレクトリに配置するのではなく、アプリケーション専用の分離されたディレクトリに配置します。 これにより、プロジェクト毎に利用するPythonバイナリや依存ライブラリを簡単に切り替えることができるようになります。
また、virtualenvはプロジェクト毎に異なるバージョンのパッケージを使い分けることができます。 あなたが古いシステムで動作するプロジェクトを抱えている場合はこの特徴は重要です。
virtualenvを一般的に利用するときには、少なくとも一つのPythonパッケージがシステムグローバル環境にインストールされていると思います。
これも一つのvirtualenv環境ですので、ここにpipを利用してvirtualenv
パッケージをインストール出来ます。
システムグローバル環境にvirtualenvパッケージがインストールされると、仮想環境を作成できるようになります。
プロジェクトディレクトリに移動してvirtualenv
コマンドを実行して下さい。
引き数には作成する仮想環境の対象ディレクトリを指定します。
以下に実行例を示します。
$ virtualenv venv
New python executable in venv/bin/python
Installing Setuptools...........[...].....done.
Installing Pip..................[...].....done.
これで新しい仮想環境が作成されました。
新しい仮想環境を有効にするには、仮想環境内に配置されている bin/activate スクリプトを読み込む必要があります。
$ which python
/usr/local/bin/python
$ source venv/bin/activate
(venv)$ which python
/Users/robert/Code/myapp/venv/bin/python
bin/activateスクリプトはシェル環境変数を変更することで、グローバル環
境の代わりに新しい仮想環境を指し示すようになります。
スクリプトを読み込むと、上記のような結果が得られるはずです。
仮想環境を有効化するとpython
コマンドは仮想環境内のバイナリを参照するようになります。
この状態でpipコマンドを利用すると、システムグローバルではなく仮想環境内に依存パッケージがインストールされます。
シェルプロンプトも変更されていることに気がついたでしょうか。
virtualenvはシェルプロンプトに現在有効になっている仮想環境の名前を表示します。
deactivate
コマンドを実行することで仮想環境を無効化できます。
(venv)$ deactivate
$
virtualenvwrapperはvirtualenv環境を管理するためのパッケージです。 このツールについて言及するためにvirtualenvの基礎について解説しましたが、virtualenvをそのまま利用するよりもこちらを利用することを推奨します。
仮想環境をプロジェクトディレクトリに作成すると、ソースコードレポジトリがごっちゃになってしまうことがあります。 このディレクトリは仮想環境を有効にする際に必要なものなのでバージョン管理の必要はありません。 そこでvirtualenvwrapperの出番です。 このパッケージは仮想環境を特定のディレクトリ(通常は ~/.virtualenvs/)で管理します。
警告 virtualenvwrapperをインストールする前に全ての仮想環境を無効化してください。
virtualenv
コマンドの代わりにmkvirtualenv
コマンドを実行して環境を作
成します。
$ mkvirtualenv rocket
New python executable in rocket/bin/python
Installing setuptools...........[...].....done.
Installing pip..................[...].....done.
(rocket)$
mkvirtualenv
コマンドは特定の仮想環境フォルダ(~/.virtualenvs/)に環境を作成し、有効化します。
先ほどのvirtualenv
と同様に、python
やpip
コマンドは仮想環境内のコマンドに切り替わります。
仮想環境を有効化するには、workon [環境名]
を実行します。
無効化するには先ほどと同様にdeactivate
コマンドを実行します。
プロジェクトが大きくなるにつれて、依存関係がどんどん増えてくる状況を経験したことはありませんか? Flaskアプリケーションを実行するために数十個の依存ライブラリが必要になることも珍しくありません。 これらの依存関係を管理する最も単純な方法はテキストファイルに記述することです。 pipはインストール済みのパッケージをテキストファイルで出力できます。 新しい環境にこれらのパッケージをインストールする際には、このテキストファイルを読み込むだけで済みます。
requirements.txtはFlaskアプリケーションの実行に必要な全てのパッケージが記述されているテキストファイルです。 以下にこのファイルの生成方法と新しい環境テキストファイルから依存パッケージをインストールする例を示します。
(rocket)$ pip freeze > requirements.txt
$ workon fresh-env
(fresh-env)$ pip install -r requirements.txt
[...]
Successfully installed flask Werkzeug Jinja2 itsdangerous markupsafe
Cleaning up...
(fresh-env)$
プロジェクトが大きくなると、pip freeze
の出力にアプリケーションの実行には必要の無い依存パッケージが含まれてしまうこともあるでしょう。
開発時だけで利用するパッケージなどがそうです。pip freeze
は実行時に必要なパッケージと開発時に必要なパッケージを区別せず、単純に現在インストールされているパッケージを出力します。
ですので、ある程度は手動で依存関係をメンテナンスする必要があります。
例えばrequire_run.txtというファイルとrequire_dev.txtというファイルに分けて依存パッケージを管理しても良いでしょう。
必ずなんらかのバージョン管理システムを使うようにしてください。 私ならGitを推奨します。 私の知る限りGitは近年最も多くのプロジェクトで採用されています。 バージョン管理を行うとやり直しのできないミスを心配すること無くコードの削除などの操作を行うことができます。 コードを削除しても元に戻すことが出来るので、コメントアウトされた大量のコードに悩む必要がなくなります。 さらに、GitHubやBitbucketや自前のGitoliteサーバーなどに完全なバックアップを保持することができます。
例外的にバージョン管理を行わない方が良いファイルもあります。 雑多なファイルや秘密のファイルなどです。 雑多なファイルとはコンパイル済みの*.pycファイルやvirtualenv環境(virtualenvwrapperを利用していない場合)などのファイルで、これらをバージョン管理する必要はありません。 .pycファイルは.pyファイルから生成物であり、virtualenv環境はrequirements.txt*ファイルから生成できるからです。
秘密のファイルとはAPIキーやアプリケーションの秘密鍵、データーベース接続のパスワードなどのファイルです。 これらのファイルが人前に晒されると、重大なセキュリティ上の脅威となりますので秘密のファイルをバージョンコントロール下に置いてはいけません。
注記 私はいつもプラーベートレポジトリであってもいつか公開される可能性があると仮定してセキュリティポリシーを策定します。 これは秘密が流出するようなセキュリティホールを無くすことは出来ないという前提に基づいています。そのようなことは誰も保証できません。 この様な「隠すことに依存したセキュリティポリシー」は悪手であるとされています。
Gitを利用する場合、レポジトリに*.gitignore*と呼ばれるファイルを作成することで、ワイルドカードにマッチしたファイルをレポジトリから除外することが出来ます。 まずは以下のファイルを除外することを推奨します。
*.pyc
instance/
*instance/*フォルダは秘密を含む設定を格納し、より安全にアプリケーションを動作させるために利用します。 これについては後ほど説明します。
注記
.gitignoreの詳細はこちらを参照して下さい。
http://git-scm.com/docs/gitignore
Flaskはデバッグモードと呼ばれる機能を持っています。
開発環境でdebug = True
と設定するとデバッグモードが有効になります。
デバッグモードではコードの変更を検知して自動的に再読み込みを行い、エラーが発生した場合はスタックトレースを出力し、インタラクティブコンソールを利用できます。
警告
本番環境でデバッグモードを有効にしないよう注意して下さい。 インタラクティブコンソールは任意のコードを実行できるため、本番環境では重大なセキュリティホールとなってしまいます。
Flask-DebugToolbarはアプリケーションの問題をデバッグするためのもうひとつのツールです。 デバッグモードでこれを利用すると、アプリケーションにサイドバーが設置されます。 サイドバーにはSQLクエリやログ、バージョン、テンプレート、設定などその他愉快な情報が表示され、問題を調査し易くなります。
注記
- 詳しくはこちらのクイックスタートを読んでください。 http://flask.pocoo.org/docs/quickstart/#debug-mode
- こちらに他のデバッガを利用したエラー処理とロギングについての情報があります。 http://flask.pocoo.org/docs/errorhandling
- アプリケーションの依存関係を維持するためにvirtualenvを利用しましょう。
- 仮想環境を維持するためにvirtualenvwrapperを利用しましょう。
- 依存関係はテキストファイルで管理しましょう。
- バージョン管理システムはGitを推奨します。
- バージョン管理システムから秘密のファイルを除外するために.gitignoreを利用しましょう。
- デバッグモードで問題調査に必要な情報を得ることが出来ます。
- Flask-DebugToolbar拡張はもっと詳細な情報を得ることが出来ます。