Blow Up by Black Swan

Python-Flask の使い方(クイックスタート編 Part.1)

前回、Flask を利用するための環境構築方法について公式ドキュメントに沿ってまとめました。次はクイックスタートの記事になります。クイックスタートは基本的な機能についてざっくり紹介しているページですが、最新版である公式ドキュメントは英語のみでわかるようなわからないような書き方をしています。そのため、構成やコード等については維持しながらも、少しはわかりやすくなるようにまとめてみました。分量の関係から 4 記事に分けています。各ページの構成は下記を参照ください。また、公式ドキュメントでは通し番号は振られていませんが、わかりやすいように通し番号を振り、目次でもそのように表示するようにしています。

前回の記事に沿って環境構築した上で、各記事ない記載のテストコードを試してみて頂ければと思います。この記事が一人でも多くの方の参考になれば幸いです。

・各記事の記載内容
Part.1 -> 1.最小アプリケーション~3.デバッグモード
Part.2 -> 4.ルーティング
Part.3 -> 5.スタティックフォルダ〜7.リクエストデータへのアクセス
Part.4 -> 8.リダイレクトエラー〜最後

公式ドキュメント: Quickstart – Flask Documentation

※なお当記事は 2019 年 9 月現在の最新バージョンである Flask1.1.x の公式ドキュメントに基づいています。今後の Flask や Python のアップデートによっては記事内容に何らかの齟齬が生じることもありますので、事前にバージョンを確認頂くか、適宜公式ドキュメントを参照頂ければと思います。

1. 最小アプリケーション

flaskは極力少ないコードでアプリケーションを作成できるWebアプリケーションフレームワークです。下記が最小アプリケーションを表す一例となります。

# 1. Flaskクラスのインポート
from flask import Flask

# 2.Flaskインスタンスの作成
app = Flask(__name__)

# 3. ルートデコレータでURLと実行内容を紐付け
@app.route('/')
def hello_world():  # 4. 関数の生成
    return 'Hello, World!'

・上記コードの内容

  1. Flaskクラスをインポート。このFlaskクラスのインスタンスががWSGIアプリケーションになる(※WSGIとはWebサーバとアプリケーションをつなぐインターフェイスのこと)
  2. Flaskクラスのインスタンス作成。第一引数はアプリケーションのモジュールかパッケージの名前をつける。上記の様なシングルモジュールの場合は__name__が推奨される(__name__が挿入されたファイル自体(メインモジュールとして)が実行された場合"__main__"の値をとるが、他のファイルからインポートされて実行された場合はモジュール名となる)。Flaskインスタンスは、テンプレートや静的ファイルを参照するため必要となる。
  3. routeデコレーターを使って、URLと実行関数を結びつける
  4. 関数の生成。ここではブラウザに表示するメッセージを返している。通常はURL->関数の順で呼び出されるが、関数を指定して呼び出すこともできる。

上記のコードを実行するため、hello.pyと名付けて保存します。Flaskクラスと混乱が生じない様flask.pyと名付けてはなりません。このアプリケーションを実行する方法は2つあります。一つ目の方法が簡便で良いと思います。

  1. flaskコマンドを使う方法
  2. Pythonの-mコマンドを使う方法

両方とも実行する前に事前に環境変数FLASK_APPを設定しておく必要があるが共通しています。そして、仮想環境下で実行したとき、”*Running on http://127.0.0.1:5000/”と表示されるとWebサーバが立ち上げられ、無事にアプリケーションがデプロイ(公開)されたことになります。「 http://127.0.0.1:5000 」にアクセすれば、”hello world”が表示されます。実行方法と実行結果は下記を参照下さい(以後、スクリーンショットを貼り付けているものは実験結果です。単元によってはテスト実行できないものもあり、そういったコードにはスクリーンショットをつけていません)。

# 1. flaskコマンドを使う場合
$ export FLASK_APP=hello.py    # 環境変数FLASK_APPを設定
$ flask run                    # flaskコマンドを実行
    *Running on http://127.0.0.1:5000/
# 2. python -mコマンドを使う場合
$ export FLASK_APP=hello.py
$ python -m flask run
 * Running on http://127.0.0.1:5000/
quickstart1

ここではテスト実行のためシンプルな組み込みサーバーを利用していますが、実際にアプリケーションとして公開する時には不十分なものです。デプロイオプションについてはこちらのDeploymentに記載されています。

2. サーバが起動しない場合の対処法

上記の実行コマンドでもサーバが起動しない場合があります。python- m flaskが失敗する場合、またはflaskコマンドが存在しない場合、それぞれ異なった原因が考えられます。

2-1. Flask のバージョンが古い場合

Flaskのバージョンが0.11より古い場合、アプリケーションを立ち上げる方法が異なります。この場合補助コマンドのflaskが存在せず、python -m flaskコマンドが機能しません。対処法としては2つあり、1つは新しいバージョンにアップデートすること、もう1つはDevelopment Serverページを見て、起動できそうな方法を試してみることです。特別な理由がない限り最新バージョンで試してみるのが良いと思うので、そこまで問題にはならないと思います。

2-2. インポート名が無効な場合

主に起こりうる原因はこちらだと思います。環境変数のFlask_APPに不正確なファイル名が設定されてしまった場合です。環境変数のFlask_APPは、実行するモジュール、またはパッケージの名前を設定します。モジュール名が不適切な場合でかつデバッグが有効になっている場合、起動時にインポートエラーが発生します。そのエラー内容を確認することで、失敗原因を知ることができます。大抵はタイプミスかappオブジェクトを生成し忘れている場合が多いです。

3. デバッグモード

flaskはローカル開発サーバーで開発できる便利さをもつ一方で、デフォルトだとコードを変更するたびに手動でリスタートし、変更を反映させる必要があります。Flaskはこれに対処するためにデバッグサポート機能を提供しており、デバッグサポートを有効にすることでコードの変更があるたびに何もせずとも自動リロードしてくれ、バグに関しては便利なデバッガー機能を提供してくれます。デバッグ機能を含む開発機能を有効にするためには、サーバーを起動する前にFLASK_ENVdevelopmentを設定するだけです。

$ export FLASK_APP=hello.py
$ export FLASK_ENV=development
$ flask run

・このコマンドを指定することで内部的に行われていること

  1. デバッガーの有効化
  2. 自動リローダーの有効化
  3. Flaskアプリケーション上でデバッグモードがオンにする

FLASK_DEBUG=1をエクスポートすることで環境ごとにデバッグモードをコントローすることもできます。Development Serverページでは他のパラメータも解説されていますので参照下さい。 デバッガーの使用に関する詳細な情報はWerkzeugドキュメントに記載されています。その他のデバッガーについてはWorking with debuggersを参照下さい。

※ 注意
Flaskの対話型デバッガーは、分岐した環境下では機能ませんが(本番環境のサーバでの使用はほぼ不可能)、一定のコードの実行ができてしまいます。これは重大なセキュリティリスクにつながるため本番環境下ではデバッガーを利用しないように注意する必要があります。

続きは次の記事へ。 

Python-Flask の使い方(クイックスタート編 Part.2)