Flaskを使ってみる

起動時のオプション


Flask起動時のオプションはいくつかあります。
そこで、以下のスクリプトで試してみました。
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    print("hello")
    return "Hello World!"

if __name__ == "__main__":
    app.run()



こちらの QuickStartでは以下の手順で起動しています。


この手順では127.0.0.1:5000にアクセスしてもエラーとなります。


IPアドレスを指定してもだめです。




以下の様に起動時のオプションでhostを指定するとアクセスできるようになります。






ポート番号のデフォルトは5000ですが、以下の指定でポート番号を変更することができます。






FLASK_ENVを指定するとDebug modeが有効になります。
Debug modeが有効になると、スクリプトが変更されたときに自動的にリロードします。




スクリプトの中でhost、port、debugを指定することができます。
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    print("hello")
    return "Hello World!"

if __name__ == "__main__":
    #app.run()
    app.run(host='0.0.0.0', port=8000, debug=True)

上記のスクリプトをpythonから起動すると、上の結果と同じになります。




起動時にconfigのプロパティに値を設定すると、コールバックの中でconfigを使うことができます。
import sys
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    print(app.config['arg'])
    return app.config['arg']

if __name__ == "__main__":
    app.config['arg'] = "Hello World!"
    print(len(sys.argv))
    if (len(sys.argv) == 2):
        app.config['arg'] = sys.argv[1]
    app.run(host='0.0.0.0', port=8000, debug=True)

スクリプト起動時に"Hello Japan"指定すると、指定した文字を表示します。




argparseライブラリと一緒に使うと、複数の引数を簡単に扱うことができます。
import argparse
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    string=app.config['arg1'] + " " + app.config['arg2']
    print("string={}".format(string))
    return string

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('--arg1', help='hoge', default="Hello")
    parser.add_argument('--arg2', help='hogehoge', default="World!")
    #app.config['arg1'] = "Hello "
    #app.config['arg2'] = "World!"
    args = parser.parse_args()
    print("args.arg1={}".format(args.arg1))
    print("args.arg2={}".format(args.arg2))
    app.config['arg1'] = args.arg1
    app.config['arg2'] = args.arg2
    app.run(host='0.0.0.0', port=8000, debug=True)

スクリプト起動時に--helpの引数を指定すると、どのような引数が指定できるかを表示します。
$ python3 argment.py --help
usage: argment.py [-h] [--arg1 ARG1] [--arg2 ARG2]

optional arguments:
  -h, --help   show this help message and exit
  --arg1 ARG1  arg1
  --arg2 ARG2  arg2

起動時の引数を省略するとデフォルトの値が使われます。
$ python3 argment.py
args.arg1=Hello
args.arg2=World!
 * Serving Flask app 'argment' (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: on
 * Running on all addresses.
   WARNING: This is a development server. Do not use it in a production deployment.
 * Running on http://192.168.10.43:8000/ (Press CTRL+C to quit)
 * Restarting with watchdog (inotify)
args.arg1=Hello
args.arg2=World!
 * Debugger is active!
 * Debugger PIN: 109-677-569

起動時の引数に--arg1と--arg2を指定することができきます。
$ python3 argment.py --arg1="GoodMoning" --arg2="Japan"
args.arg1=GoodMoning
args.arg2=Japan
 * Serving Flask app 'argment' (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: on
 * Running on all addresses.
   WARNING: This is a development server. Do not use it in a production deployment.
 * Running on http://192.168.10.43:8000/ (Press CTRL+C to quit)
 * Restarting with watchdog (inotify)
args.arg1=GoodMoning
args.arg2=Japan
 * Debugger is active!
 * Debugger PIN: 109-677-569



FlaskはデフォルトではHTTP/1.1に対応していません。
応答を返すとさっさとサーバー側から接続を切ってしまうので、クライアント側の実装によってはサーバーからの応答を取りこぼします。
調べたらこち らにHTTP/1.1に対応する方法が公開されていました。

これがデフォルトのレスポンスです。
HTTP/1.1でリクエストを投げても、HTTP/1.0で戻ってきます。
タイミングによってはレスポンスを取りこぼします。
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 12
Server: Werkzeug/1.0.1 Python/3.7.5
Date: Wed, 18 Nov 2020 13:28:49 GMT

Hello World!

これがHTTP/1.1の応答です。
HTTP/1.1でリクエストを投げると、デフォルトではkeep-aliveとなるので、クライアント側で受信タイムアウトを設定する必要が有 ります。
受信タイムアウトを設定しないと、永遠にサーバーからの応答を待ちます。
サーバーとの接続解除(コネクションの切断)はクライアント側から行います。
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 12
Server: Werkzeug/1.0.1 Python/3.7.5
Date: Wed, 18 Nov 2020 13:29:09 GMT

Hello World!

応答ヘッダーの時刻がGMTになっていますが、これは変えられません。

続く...