Flask で JSON リクエストを受け取る

API を構築する場合、クライアントから JSON 形式でデータを受け取ることが多い。Flask では request.json または request.get_json() で JSON データを取得できる。

JSON リクエストの受け取り

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/api/users', methods=['POST'])
def create_user():
    data = request.json
    name = data.get('name')
    email = data.get('email')
    return jsonify({'message': f'User {name} created'}), 201

request.json はリクエストボディを JSON としてパースし、Python の辞書として返す。Content-Type が application/json でない場合は None を返す。

get_json メソッド

request.get_json() を使うと、オプションを指定できる。

data = request.get_json(force=True, silent=True)
forceContent-Type に関係なく JSON としてパースする
silentパースに失敗しても例外を投げず None を返す

JSON レスポンスの返却

JSON を返すには jsonify 関数を使う。

@app.route('/api/users/<int:user_id>')
def get_user(user_id):
    user = {'id': user_id, 'name': 'Alice'}
    return jsonify(user)

jsonify は辞書を JSON 文字列に変換し、Content-Type を application/json に設定した Response オブジェクトを返す。

エラーハンドリング

JSON のパースに失敗した場合や、必須キーがない場合のエラー処理も重要である。

@app.route('/api/data', methods=['POST'])
def receive_data():
    data = request.get_json()
    if data is None:
        return jsonify({'error': 'Invalid JSON'}), 400
    if 'value' not in data:
        return jsonify({'error': 'Missing required field: value'}), 400
    return jsonify({'received': data['value']})

クライアントに適切なエラーメッセージを返すことで、デバッグが容易になる。