【Flask】開発用WEBサーバーを "app.run()" or "flask run" のどちらで起動する？

## app.run()とflask runを使う場合の設定方法を確認する

### 実行環境
+ python : 3.10.6
+ Flask : 2.2.2
+ python-dotenv

### ファイル構成
```
helloworld 
  ├─ apps
  |    └─ helloworld.py
  └ .flaskenv
```

### 実行するflask app
```helloworld.py
from flask import Flask, redirect, url_for

app = Flask(__name__)

@app.route('/')
def index():
    return redirect(url_for('helloworld'))

@app.route('/helloworld')
def helloworld():
    return '''
    <h3> Hello, World! </h3>
    <p> Welcome to Flask WebApp World <p>
    '''
```
![helloworld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699739/506e4f4d-2ea8-c9da-3155-e06823dc992a.png)



## app.run()を設定する
```helloworld.py
if __name__ == ('__main__'):
    app.run(debug=True, host='0.0.0.0', port=5050)

```

### 設定項目

+ helloworld.pyの最後に上記を記載し、pythonコマンドから直接ファイルを実行できるようにする

| 引数 | 内容 |
|:-|:-|
| __debug=True__ | デバッグモードをオンにする |
| __host='0.0.0.0'__ | localhost以外からのアクセスが可能。実行すると開発WEBサーバのアドレスが指定される |
| __port=5050__ | オープンするポートを指定 |
+ その他にもreloadに関する設定項目もある


### 実行結果
```bash
$ python helloworld.py
 * Serving Flask app 'helloworld'
 * Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:5050
 * Running on http://172.16.10.101:5050
Press CTRL+C to quit
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 437-474-661
```


## flask runを設定する

+ __python-dotenv__ をインストールしておく
+ __.env__ もしくは __.flaskenv__　に設定内容記載する

```.flaskenv
FLASK_APP=apps.helloworld.py
FLASK_DEBUG=1
FLASK_RUN_HOST='0.0.0.0'
FLASK_RUN_PORT=5050
```
| 引数 | 内容 |
|:-|:-|
| FLASK_APP=apps.helloworld.py | helloworld.pyまでのルート記載。 /（スラッシュ）ではなく.（ドット）を使用する |
| FLASK_DEBUG=1 | 「1」でデバッグーモード、「0」でプロダクションモード  |
| FLASK_RUN_HOST | localhost以外からのアクセスが可能。実行すると開発WEBサーバのアドレスが指定される (string)|
| FLASK_RUN_PORT=5050 | オープンするポートを指定 (integer) |

:::note warn
+ FLASK_DEBUG=1ではなく、FLASK_ENV=development という記述でデバッグモードをオンする方法がウェブ上で散見されるが、Flask 2.3からはこの方法は廃止されるとのこと。
+ 実行時に以下のメッセージが表示される
'FLASK_ENV' is deprecated and will not be used in Flask 2.3. Use 'FLASK_DEBUG' instead.（FLASK_ENV' は非推奨で、Flask 2.3 では使用されません。代わりに 'FLASK_DEBUG' を使ってください。）

+ Release noteにも下記の記載あり
    The FLASK_ENV environment variable and app.env attribute are deprecated, removing the distinction between development and debug mode. Debug mode should be controlled directly using the --debug option or app.run(debug=True). #4714
    (FLASK_ENV環境変数とapp.env属性が廃止され、開発モードとデバッグモードの区別がなくなりました。デバッグモードは --debug オプションまたは app.run(debug=True) を使って直接制御する必要があります。#4714)

:::

### 実行結果
```bash
$ flask run
 * Serving Flask app 'apps.helloworld.py'
 * Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:5050
 * Running on http://172.16.10.101:5050
Press CTRL+C to quit
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 437-474-661
```

## 結論
+ __app.run()とflask runは、どちらかに絞る必要はなく両方一緒に使える__
+ __app.run()__ はアプリケーションのルートなどを考えなくて良い
+ __flask run__ はpython-dotenvを利用する