Blow Up by Black Swan

Python-Flask で作る Web アプリケーション(チュートリアル編8)


チュートリアルに関する最後の記事になります。

参考サイト: Flask – Tutorial(公式ドキュメント)

10. 本番環境へのデプロイ

チュートリアルのこのパートは、アプリケーションをデプロイするサーバを既に持っていることを前提としています。ここではディストリビューションファイルを作成し、インストールする方法の概要を述べるにとどめ、どのサーバやソフトウェアを使うべきかについては立ち入って説明してはいません。下のインストラクションを試すために新しい開発環境をセットアップしますが、実際の公開アプリケーションのホストには使うことは推奨されていません。アプリケーションをホストする多くの方法の一覧を見るには、Development Optionsを参照下さい。

10-1. ビルドとインストール

アプリケーションをどこかにデプロイする場合、ディストリビューションファイルを作成する必要があります。現在のPythonディストリビューションの標準は、.whl拡張子を持ったwheelフォーマットです。まず、wheelライブラリがインストールされていることを確認して下さい。

(env)flask-tutorial$ pip install wheel

Pythonでsetup.pyを実行すると、ビルド関連のコマンドを発するコマンドラインツールを取得できます。bdist_wheelコマンドは、wheelディストリビューションファイルをビルドします。

(env)flask-tutorial$ python setup.py bdist_wheel

このコマンドを実行すると、dist/flaskr-1.0.0-py3-none-any.whlファイルが作成されます。ファイル名はプロジェクトの名前で、ファイルのバージョンやタグをインストールできます。

他のマシーンにこのファイル(dist/flaskr-1.0.0-py3-none-any.whl)をコピーし、新しい仮想環境を構築してpipを使ってこのファイルをインストールして下さい。

(env)other-env$ pip install flaskr-1.0.0-py3-none-any.whl

pipは依存関係に沿って、プロジェクトをインストールします。

インストールしたマシーンは、開発したものとは異なるマシーンのため、instanceフォルダにデータベースを作る必要があるので、再度init-dbコマンドを実行します。

(venv)other-env$ export FLASK_APP=flaskr
(venv)other-env$ flask init-db

Flaskはアプリケーションを見つけ、それをインストールします(編集モードではない)。この場合、instanceフォルダは異なるフォルダを使います。venv/var/flaskr-instanceがinstanceフォルダです。

10-2. シークレットキーを設定する。

チュートリアルの初めにSECRET_KEYに初期値を設定しましたが、本番環境では、これはランダムなbyteデータに変更すべきです。そうでない場合、サイトアタッカーがセッションクッキーやシークレットキーを利用するデータを変更するためにdevキーを使用する可能性があります。ランダムなシークレットキーの生成は次のコマンドで行えます。

$ python -c 'import os; print(os.urandom(16))'

b'_5#y2L"F4Q8z\n\xec]/'

存在する場合にファクトリーが読み取るinstanceフォルダにconfig.pyファイルを作成し、そこに生成したシークレットキーをコピーします。

# venv/var/flaskr-instance/config.py

SECRET_KEY = b'_5#y2L"F4Q8z\n\xec]/'

このFlaskrアプリケーションでは、このファイルに設定される値はSECRET_KEYだけですが、他にも必要な設定を記述することもできます。

10-3. 本番環境で実行する

開発環境下ではなく、公で公開しているとき、組み込みの開発サーバを利用すべきではありません(flask run)。開発サーバは、便宜上Werkzeugによって提供されていますが、特別効率的、安定的、安全なものではありません。

代わりに本番用のWSGIサーバを使います。例えば、[Waitress]を使うには、まず仮想環境にWaitressをインストールします。

(venv)other-env$ pip install waitress

Waitressにこのアプリケーションについて伝える必要がありますが、flask runで行うFlask_APPは使用しません。アプリケーションオブジェクトを取得するために、アプリケーションファクトリーをインストールし、呼び出すよう、Waitressに指令する必要があります。

(venv)other-env$ waitress-serve --call 'flaskr:create_app'
Serving on http://0.0.0.0:8080

アプリケーションをホストする他の多くの方法を見るには、Development Optionsを参照下さい。Waitressは一例であり、WindowsもLinuxもサポートするため選択されました。プロジェクトで選択できるWSGIサーバやデプロイオプションは他にもたくさん存在します。

tutorial1

11. 開発し続けろ!

このチュートリアルを通して、FlaskとPythonについて多くのことを学習しました。チュートリアルを再度確認し、記述したコードとそこに至ったステップを比較してみて下さい。自身のプロジェクトとサンプルプロジェクトを比較してみて下さい。チュートリアルを一歩ずつ進んできたので、最初とは少し異なって見えるかもしれません。

Flaskには、今まで見た以上に多くの機能があります。しかし、自身のウェブアプリケーションの開発を始められる技能は既に身についています。Flaskができることをより知るにはQuickstartをチェックして下さい。それからさらに学ぶにはドキュメントを読み込んでみて下さい。Flaskは、場面場面でJinjaClickWerkzeugItsDengerousを使っています。そして、それらは全て独自のドキュメントを持っています。またデータベース操作やフォームデータの検証などのタスクをシンプルかつ強力に行う拡張機能もあります。

Flaskrプロジェクトを引き続き開発し続ける場合、次に行うと面白いアイディアはいくつかあります。

  • 一つの投稿を表示する詳細なページ。投稿のタイトルをクリックすると、そのページへ飛ぶ
  • 投稿にライク/アンライクをつける
  • コメント
  • タグ。タグをクリックすると、そのタグを持つ全ての投稿を見れるようにする
  • インデックスページを名前でフィルターをかける検索ボックス
  • ページ表示。1ページにつき5件の投稿を表示する
  • 投稿に付随する画像をアップロードできるようにする
  • マークダウンを使った投稿を整形する
  • 新しい投稿のRSSフィード

楽しみながら、素晴らしいアプリケーションを作ろう!

最後に

以上がFlaskの公式ドキュメントに記載されているチュートリアルの内容です。クイックスタートとこのチュートリアルを理解できればある程度のアプリケーションを作成できます。私もこのチュートリアルを学んだ時は、これを参考にアプリケーションを作りました。アプリケーションを作るために必要な情報が網羅されていると思いますので、ぜひ参考にして頂ければと思います。

読んで頂き、ありがとうございました。