【Ubuntu】FlaskでHello Worldする方法を超丁寧に解説する。

2019年7月9日

FlaskでHello Worldを出力する方法を超詳しく解説します。

実行環境

OS: Ubuntu 18.04.2 LTS
python: 3.6.8

Hello World!!までの流れ

flaskのinstall

$ sudo apt install python3-pip
$ pip3 install flask

pip3はpython3系のパッケージ管理ツールです。

コーディング

それではインストールが完了したと思いますので、早速コードを書いていきます。

from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
    return "Hello World!"
app.run()

書き終えたらファイルを保存。

では実行。

$ python hello_flask.py
 * Serving Flask app "hello_flask" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

出力された英文に一行ずつ和訳付けてみました。

 * Serving Flask app "hello_flask" (lazy loading)
 (和訳)"hello_flask"というFlaskのアプリケーションが利用可能状態です (遅延読み込み*)
 * Environment: production
 (和訳)環境: 本番環境
   WARNING: This is a development server. Do not use it in a production deployment.
 (和訳)注意: これは開発用のサーバーです。製品用には展開しないでください。
   Use a production WSGI server instead.
 (和訳)代わりにWSGIサーバーを使ってください
 * Debug mode: off
 (和訳)デバッグモード: おふ
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 (和訳)http://127.0.0.1:5000/で動いています(止めるにはCTRL+Cを押すこと)

*遅延読み込みとは

実際にオブジェクトが必要とされたときに後から初期化を行うソフトウェアデザインパターンの一つ

by wikipedia

つまり、呼ばれた時に必要なものだけが働くってことです。
ファイル実行したらすぐに最初順番に最後まで処理を走らせてしまうものの逆パターンになります。

それではブラウザでhttp://127.0.0.1:5000/ を入力してエンター。
Hello World!!が出力されたと思います。

ここからは一行一行コードがどんな役割を持っているのか解説します。

よく分かるコード解説

hello_flask.py に書かれていることを細かく説明していく。
再度全文↓

from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
    return "Hello World!"
app.run()
  • from flask import Flask

flaskというモジュールからFlaskクラスを持ってきています。

  • app = Flask(__name__)

__name__という名称をつけて、Flaskをインスタンス化している。

(ここから少しの間難しい話になるので、飛ばしたい方は飛ばしてください。)

ちなみに”__name__”はファイルを直接実行された時は”__main__”という文字列が入っており、
別のファイルから読み出された時には”__name__”と記述がされているファイルのファイル名が拡張子なしで入っている。

実行した時に下記の出力があったことを覚えていますか?

Serving Flask app "hello_flask"

ファイルを直接しているにも関わらず、なぜか__main__ではなくファイル名であるhello_flaskという名称のflaskアプリケーションが作成されています。

これでは先ほどのファイルが直接実行された時には__name__という変数に”__main__”という文字列が格納されているという説明と矛盾してしまう。

実はflaskのコードを読んでみると分かるのだが、実は__main__という文字列が与えられた時には、裏でappが作成されたファイル名がapp名になる様に処理が行われています。

このことに関しての詳しい説明は以下の記事に記載したので興味がある方は読んでみてください。

(難しい話終了)

@app.route(‘/’)

ここが一番難しい箇所です。
Flask公式サイトによると以下のように役割が説明されています。

We then use the route() decorator to tell Flask what URL should trigger our function.

つまり引数として渡しているパスにアクセスが来たら、この直下の関数が実行されます。
今回の場合は/、つまりルートにアクセスが来たら以下の関数が実行されることになります。

def hello():
    return "Hello World!"

app.run()

Flaskアプリケーションを起動させている。
起動後は先ほど説明した@app.route(‘/’)が効力を持つようになる。

まとめ

以上でFlaskでHello Worldするまでの流れは解説終了です。

もっと説明してほしい箇所がありましたら、コメントお願いします。

FlaskをuWSGI, nginxと連携させる方法について以下の記事でまとめてるので、
応用編として是非お読みください。こちらは実際にアプリケーションとして実行する時によく使われる構成なので実践的です。