Pythonのフレームワーク「Flask」を用いてHelloWolrdしてみた

# 概要

pythonでのWebアプリ開発の経験がなかったため、勉強としてFlaskフレームワークを使用していろいろ作成を行ってみました。
この記事では、Hello Worldレベルの最低限の実装となっています。

# Flaskとは
[Flask Documentation](https://flask.palletsprojects.com/en/2.2.x/)
[Flask 日本語Documentation](https://msiz07-flask-docs-ja.readthedocs.io/ja/latest/)

Flaskは、Python製のマイクロWebフレームワークです。
__マイクロ=コアとなる機能を保ちつつ拡張性を持っている__ という解釈です。
拡張機能を多く持ち、必要に応じて追加することで自由度が高いです。
また、最低限の機能を使うための学習コストが低く、誰にでもすぐに利用することができます。

開発に必要な多くの機能が実装されているという点では、[Django](https://www.djangoproject.com/)の方がフルスタックフレームワークとして優れています。


# 開発環境
OS Windows10
Docker 20.10.7
Visual Studio Code 1.7.1

DockerでCentOS7環境を構築し、コンテナ内で作成を行っています。

# 事前設定

Flaskを利用するための事前準備を進めていきます。

### コンテナの起動
今回は公開済みのCentOS7のDockerイメージからコンテナを構築しています。
Dockerイメージ取得～コンテナ起動まで実行します。
```sh
# Dockerイメージ取得
$ docker pull centos:centos7
centos7: Pulling from library/centos
2d473b07cdd5: Already exists
Digest: sha256:c73f515d06b0fa07bb18d8202035e739a494ce760aa73129f60f4bf2bd22b407
Status: Downloaded newer image for centos:centos7
docker.io/library/centos:centos7

$ docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
centos        centos7   eeb6ee3f44bd   11 months ago   204MB

# コンテナ起動
$ docker run -it -d --name centos7 centos:centos7
c4e8532de5f720c60097a7eef5cf33b049dffc4122d68dfd41ff9887ceeced46

$ docker ps
CONTAINER ID   IMAGE            COMMAND       CREATED          STATUS          PORTS     NAMES
c4e8532de5f7   centos:centos7   "/bin/bash"   35 seconds ago   Up 32 seconds             centos7
```

### Python環境の準備
**ここからはコンテナ内での操作となります。**
インストールされていなければPythonのインストールを行ってください。
今回はPython 3.6.8をインストールしています。

```sh
# python3のインストール
$ yum install -y python3
     -- 省略 --

$ python --version
Python 3.6.8
```
仮想環境をvenvで構築&有効化します。
仮想環境名はvenvにしています。
```sh
# 作業ディレクトリに移動
$ cd working_dir

# 仮想環境venvの作成
$ python3 -m venv venv

# 仮想環境venvの有効化
$ source venv/bin/activate
```
Flaskを仮想環境上にインストールします。
インストールが完了すると`flask`コマンドが使用できるようになります。
これで準備完了です。
```sh
# flaskのインストール
(venv)$ pip install flask
```

## Flaskの仕様

### 環境変数について
Flaskでは2つの環境変数で制御することができます。
環境変数を事前にexportで設定しておくか、.envファイルで管理する方法があります。

- FLASK_APP　：　アプリ起動時に実行するソースを指定する
- FLASK_ENV　：　開発か本番か指定する(development or production)

また、`.env`ファイルがある状態でアプリを実行すると、アプリのルートディレクトリが`.env`ファイルがあるディレクトリとなります。

# ソースコードの作成
主に**リクエスト先のURI**と**関数**を紐づけるルーティングをおこなっています。
関数の先頭にデコレーターと呼ばれる`@app.route()`を追加することでルートを追加できます。
```python:hello.py
from flask import Flask

app = Flask(__name__)

# http://127.0.0.1:5000にアクセスしたときに呼び出される
@app.route("/")
def index():
    return "Hello Flask!"

# http://127.0.0.1:5000/helloにアクセスしたときに呼び出される
@app.route("/hello")
def hello():
    return "Hello Wolrd!"
```

`flask routes`コマンドで、作成したルートの確認ができます。
indexとhelloの2つができていることを確認しましょう。
```sh
(venv) $ flask routes
Endpoint        Methods    Rule
--------------  ---------  -----------------------
hello           GET        /hello
index           GET        /
static          GET        /static/<path:filename>
```

# アプリ実行
環境変数FLASK_APPにhello.pyを設定しておきます。
開発用ということで、環境変数FLASK_ENVはdevelopmentに設定しておきます。
```sh
$ export FLASK_APP=hello.py
$ export FLASK_ENV=development
```



`flask run`で実行できます。
```sh
$ flask run
 * Serving Flask app 'hello.py' (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: XXX-XXX-XXX
```

http://127.0.0.1:5000 にアクセスして **Hello Flask!** と表示されていればOKです。
http://127.0.0.1:5000/hello にアクセスすると **Hello World!** と表示されます。

# まとめ
FlaskでHello Worldアプリを作るには以下の手順でOK
1. Flaskをインストールする
2. ルーティングをコードで実装
3. 環境変数の設定
4. アプリを起動


便利なポイントがあれば別記事でさらに投稿していく予定です。

# 参考文献

[Python FlaskによるWebアプリ開発入門](https://www.shoeisha.co.jp/book/detail/9784798175164)
著：佐藤昌基、平田哲也
監修：寺田学