【Python】Flaskで全てのURLを受け取る方法

こんにちは、にわこまです!

今回はpythonのflaskというライブラリでアプリを立ち上げたとき、全てのURLを受け取る方法を紹介します。使い方としては、テスト的にflaskで簡単なアプリを立ててURLの挙動を確認したり、クエリパラメータやリクエストボディがどのように見えるかを確認することなどです。

 

 

スポンサードサーチ


結論

@app.route(“/”, defaults={“path”:””}, methods=[“GET”, “POST”, “PUT”, “DELETE”])
@app.route(“/<path:path>”, methods=[“GET”, “POST”, “PUT”, “DELETE”])

 

上記2行のアノテーションをメソッドに付与することで全てのURLを受け取ることができます。

 

1行目は、インデックスルートに全てのメソッドが通ることを設定しています。「defaults」は2行目のアノテーションの初期値を設定しています。このdefaultsを設定しないとエラーが発生します。

2行目は、インデックス以外の全てのURLに全てのメソッドが通ることを設定しています。

 

 

ソースコード

全てのURLを受け取ることができるflaskアプリのソースコードを以下に示します。

from flask import Flask, request, jsonify
import logging

app = Flask(__name__)

# ログの設定
logging.basicConfig(
    level=logging.INFO,
    format="[%(asctime)s] [%(levelname)s] %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S"
)

@app.route("/", defaults={"path":""}, methods=["GET", "POST", "PUT", "DELETE"])
@app.route("/<path:path>", methods=["GET", "POST", "PUT", "DELETE"])
def index(path):
    app.logger.info("Start.")

    # ログ出力
    headers = request.headers
    method = request.method
    url = request.url
    query_param = request.args
    data = None
    if (method in ["POST", "PUT"]):
        app.logger.info("request.is_json: {0}".format(request.is_json))
        if (request.is_json):
            data = request.get_json()
    app.logger.info("headers: " + str(headers.to_wsgi_list()))
    app.logger.info("method : {0}".format(method))
    app.logger.info("url    : {0}".format(url))
    app.logger.info("path   : {0}".format(path))
    app.logger.info("query  : " + str(query_param.to_dict()))
    app.logger.info("data   : {0}".format(data))

    app.logger.info("End.")
    return jsonify({"result": "OK"}), 200

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

 

 

コードの解説

1行目はflaskライブラリから必要なモジュールをインポートしています。

2行目はloggingライブラリをインポートしています。

 

4行目はflaskでアプリを立ち上げるための設定を定義しています。

 

7行目から11行目はログ出力用の設定を定義しています。

 

13行目は、インデックスルートに全てのメソッドが通ることを設定しています。「defaults」は14行目のアノテーションの初期値を設定しています。このdefaultsを設定しないとエラーが発生します。

14行目は、インデックス以外の全てのURLに全てのメソッドが通ることを設定しています。

 

15行目から36行目は要求を受信したときの処理を定義しています。

16行目は「Start.」という文字列をログとして出力しています。処理の開始を分かりやすくするために出力しています。

 

19行目はheadersにヘッダーを代入しています。

20行目はmethodにメソッドを代入しています。

21行目はurlにURLを代入しています。

22行目はquery_paramにクエリパラメータを代入しています。

23行目はdataにNoneを代入して初期化しています。

24行目から27行目はメソッドがPOSTまたはPUTである場合、リクエストボディを取得する処理を定義しています。

24行目はメソッドがPOSTまたはPUTであることを判断しています。

25行目はリクエストボディの有無をログに出力しています。

26行目はリクエストボディの有無を判断しています。

27行目はdataにリクエストボディを代入しています。

 

28行目はヘッダーをログに出力しています。出力する際にリストに変換しています。

29行目はメソッドをログに出力しています。

30行目はURLをログに出力しています。

31行目はパスパラメータをログに出力しています。

32行目はクエリパラメータをログに出力しています。

33行目はリクエストボディをログに出力しています。

 

35行目は「End.」という文字列をログとして出力しています。処理の終了を分かりやすくするために出力しています。

 

36行目は結果を返しています。内容は「{“result”: “OK”}」で、ステータスコードは「200」にしています。

 

38行目と39行目でmain.pyが実行されたときにアプリを立ち上げるように定義しています。

 

 

スポンサードサーチ


動作確認

main.pyを保存したディレクトリまで移動します。

下記のコマンドを実行します。

python3 main.py
=====
 * Serving Flask app 'main'
 * Debug mode: off
[2024-09-08 08:49:13] [INFO] 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:5000
 * Running on http://172.31.113.54:5000
[2024-09-08 08:49:13] [INFO] Press CTRL+C to quit

 

下記のコマンドを実行します。「{“result”:”OK”}」が帰ってくることを確認します。

curl -X GET "http://127.0.0.1:5000/" -sS

以下に上記コマンドを実行したログを示します。

[2024-09-08 09:30:52] [INFO] Start.
[2024-09-08 09:30:52] [INFO] headers: [('Host', '127.0.0.1:5000'), ('User-Agent', 'curl/7.81.0'), ('Accept', '*/*')]
[2024-09-08 09:30:52] [INFO] method : GET
[2024-09-08 09:30:52] [INFO] url    : http://127.0.0.1:5000/
[2024-09-08 09:30:52] [INFO] path   :
[2024-09-08 09:30:52] [INFO] query  : {}
[2024-09-08 09:30:52] [INFO] data   : None
[2024-09-08 09:30:52] [INFO] End.
[2024-09-08 09:30:52] [INFO] 127.0.0.1 - - [08/Sep/2024 09:30:52] "GET / HTTP/1.1" 200 -

 

下記のコマンドを実行します。「{“result”:”OK”}」が帰ってくることを確認します。

curl -X POST -H "Content-Type: application/json" "http://127.0.0.1:5000/user" -d "{\"name\": \"sample\", \"age\": 369}" -sS

以下に上記コマンドを実行したログを示します。

[2024-09-08 09:35:25] [INFO] Start.
[2024-09-08 09:35:25] [INFO] request.is_json: True
[2024-09-08 09:35:25] [INFO] headers: [('Host', '127.0.0.1:5000'), ('User-Agent', 'curl/7.81.0'), ('Accept', '*/*'), ('Content-Type', 'application/json'), ('Content-Length', '30')]
[2024-09-08 09:35:25] [INFO] method : POST
[2024-09-08 09:35:25] [INFO] url    : http://127.0.0.1:5000/user
[2024-09-08 09:35:25] [INFO] path   : user
[2024-09-08 09:35:25] [INFO] query  : {}
[2024-09-08 09:35:25] [INFO] data   : {'name': 'sample', 'age': 369}
[2024-09-08 09:35:25] [INFO] End.
[2024-09-08 09:35:25] [INFO] 127.0.0.1 - - [08/Sep/2024 09:35:25] "POST /user HTTP/1.1" 200 -

 

下記のコマンドを実行します。「{“result”:”OK”}」が帰ってくることを確認します。

curl -X PUT -H "Content-Type: application/json" "http://127.0.0.1:5000/user/sample" -d
 "{\"age\": 30}" -sS

以下に上記コマンドを実行したログを示します。

[2024-09-08 09:38:30] [INFO] Start.
[2024-09-08 09:38:30] [INFO] request.is_json: True
[2024-09-08 09:38:30] [INFO] headers: [('Host', '127.0.0.1:5000'), ('User-Agent', 'curl/7.81.0'), ('Accept', '*/*'), ('Content-Type', 'application/json'), ('Content-Length', '11')]
[2024-09-08 09:38:30] [INFO] method : PUT
[2024-09-08 09:38:30] [INFO] url    : http://127.0.0.1:5000/user/sample
[2024-09-08 09:38:30] [INFO] path   : user/sample
[2024-09-08 09:38:30] [INFO] query  : {}
[2024-09-08 09:38:30] [INFO] data   : {'age': 30}
[2024-09-08 09:38:30] [INFO] End.
[2024-09-08 09:38:30] [INFO] 127.0.0.1 - - [08/Sep/2024 09:38:30] "PUT /user/sample HTTP/1.1" 200 -

 

下記のコマンドを実行します。「{“result”:”OK”}」が帰ってくることを確認します。

curl -X DELETE "http://127.0.0.1:5000/user/sample" -sS

以下に上記コマンドを実行したログを示します。

[2024-09-08 09:40:04] [INFO] Start.
[2024-09-08 09:40:04] [INFO] headers: [('Host', '127.0.0.1:5000'), ('User-Agent', 'curl/7.81.0'), ('Accept', '*/*')]
[2024-09-08 09:40:04] [INFO] method : DELETE
[2024-09-08 09:40:04] [INFO] url    : http://127.0.0.1:5000/user/sample
[2024-09-08 09:40:04] [INFO] path   : user/sample
[2024-09-08 09:40:04] [INFO] query  : {}
[2024-09-08 09:40:04] [INFO] data   : None
[2024-09-08 09:40:04] [INFO] End.
[2024-09-08 09:40:04] [INFO] 127.0.0.1 - - [08/Sep/2024 09:40:04] "DELETE /user/sample HTTP/1.1" 200 -

 

下記のコマンドを実行します。「{“result”:”OK”}」が帰ってくることを確認します。

curl -X GET "http://127.0.0.1:5000/user?firstName=sample" -sS

以下に上記コマンドを実行したログを示します。

[2024-09-08 09:44:39] [INFO] Start.
[2024-09-08 09:44:39] [INFO] headers: [('Host', '127.0.0.1:5000'), ('User-Agent', 'curl/7.81.0'), ('Accept', '*/*')]
[2024-09-08 09:44:39] [INFO] method : GET
[2024-09-08 09:44:39] [INFO] url    : http://127.0.0.1:5000/user?firstName=sample
[2024-09-08 09:44:39] [INFO] path   : user
[2024-09-08 09:44:39] [INFO] query  : {'firstName': 'sample'}
[2024-09-08 09:44:39] [INFO] data   : None
[2024-09-08 09:44:39] [INFO] End.
[2024-09-08 09:44:39] [INFO] 127.0.0.1 - - [08/Sep/2024 09:44:39] "GET /user?firstName=sample HTTP/1.1" 200 -

 

 

まとめ

今回はpythonのflaskというライブラリでアプリを立ち上げたときに全てのURLを受け取る方法を紹介しました。

 

下記の2行で実現できます。

@app.route(“/”, defaults={“path”:””}, methods=[“GET”, “POST”, “PUT”, “DELETE”])
@app.route(“/<path:path>”, methods=[“GET”, “POST”, “PUT”, “DELETE”])

他にflaskで実現したいことや困っていることがあればメールにてお問い合わせお願いします。

 

最後までお読みいただきありがとうございます。


スポンサードサーチ