Flaskでリクエストを処理する方法
概要
Flaskでは、リクエストの処理はルーティング関数内で行います。
ルーティング関数の引数には、リクエストボディやパスパラメータが渡されます。
これらを使用して、リクエストに関連するデータの取得やレスポンスの生成などを行います。
ここでは、以下バージョンを使用した、Flaskでリクエスト処理する方法を説明します。
Flask v2.1.0
Python v3.11.4
また、今回作成するコードは全て、GitHub に掲載しています。
リクエスト情報を取得する方法
リクエストに関する情報を取得するには、リクエストオブジェクトを使用します。 Flaskのルーティング関数で使用され、リクエストヘッダー、パラメータ、ボディなどのデータにアクセスするために利用されます。
以下のサンプルコードは、Flaskでリクエストオブジェクトを理解するための例です。POSTリクエストを受け取り、リクエストヘッダー、ボディデータにアクセスして、それらの値を含むレスポンスを返します。
app.py
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/items/", methods=["POST"])
def create_item():
item = request.json
user_agent = request.headers.get('User-Agent')
item.update({"user_agent": user_agent})
return jsonify(item)
解説
- 必要なライブラリとモジュールのインポート:
from flask import Flask, request, jsonify
Flask
は、APIを作成するための主要なクラスです。request
は現在のHTTPリクエストデータにアクセスするためのオブジェクト、jsonify
はPythonのデータ構造をJSONに変換するための関数です。
- Flaskアプリケーションのインスタンス化:
app = Flask(__name__)
app
は、このFlaskアプリケーションの新しいインスタンスを作成します。これはアプリケーションの主要なエントリーポイントで、ルーティング定義などの設定を行います。
- ルーティングとエンドポイントの定義:
以下の例では、新しいアイテムを作成するエンドポイントを定義しています。
@app.route("/items/", methods=["POST"])
def create_item():
item = request.json
user_agent = request.headers.get('User-Agent')
item.update({"user_agent": user_agent})
return jsonify(item)
このエンドポイントはFlaskのデコレータ機能を使用して定義され、HTTPメソッド(POST
)とURLパス(/items/
)を指定します。
エンドポイントの関数内では、まずリクエストボディからJSONデータを取得し、その後リクエストヘッダーからユーザーエージェントの情報を取得します。これらの情報を元にレスポンスを生成し、JSONとして返します。 Flaskアプリケーションを起動するには、以下のコマンドを実行します:
export FLASK_APP=app.py
flask run
テスト
curl -X POST -H "Content-Type: application/json" -d '{"name": "item1", "price": 10.0}' http://localhost:5000/items/
まとめ
この記事では、PythonのフレームワークであるFlaskを使用したリクエスト処理の方法について紹介しました。Flaskを用いてルーティング関数を設定し、リクエストボディやパスパラメータを活用してリクエストデータの取得やレスポンスの生成を行う方法を解説しました。
具体的なコード例として、POSTリクエストを受け取り、リクエストヘッダーとボディからデータを取得し、それらの情報を含むレスポンスを生成する簡単なFlaskアプリケーションを示しました。このアプリケーションでは、リクエストオブジェクトを使用してリクエスト情報にアクセスし、その情報を元にレスポンスを生成しています。
Flaskはそのシンプルさと拡張性から広く使われており、今回紹介したリクエスト処理の方法はWebアプリケーションやAPIの開発において非常に有用です。今後もFlaskを使った開発を進める上で、本記事や掲載したGitHubのコードを参考にしていただければと思います。