2020年9月2日水曜日

Flask の POST メソッド時のリクエスト JSON に含まれるキーをキャメルケースでもスネークケースでも受け取れるようにする方法

概要

デコレータと正規表現を使って実現しています
正規表現はキャメルケースをスネークケースに変更することを想定しています
一応変換後のスネークケースのキーが存在しない場合にだけ追加するようにしています
また request.json を shallow copy することで request.json の値をデコレータで動的に変更しています

環境

  • macOS 10.15.6
  • Python 3.8.5
    • flask 1.1.2

サンプルコード

import re
import copy
from flask import Flask, request, jsonify

app = Flask(__name__)

def _convert(name):
    s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name)
    return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).lower()

def convert(func):
    def wrapper(*args, **kwargs):
        req = copy.copy(request.json)
        for key, value in req.items():
            new_key = _convert(key)
            if (new_key in req.keys()) is False:
                request.json[new_key] = value
        return func(*args, **kwargs)
    return wrapper

@app.route('/', methods=["POST"])
@convert
def hello_world():
    req = request.json
    print(req)
    return req["user_name"]

# curl -XPOST -H 'content-type: application/json' -d '{"user_name":"hawksnowlog"}' localhost:5000
# curl -XPOST -H 'content-type: application/json' -d '{"userName":"hawksnowlog"}' localhost:5000

request.json にユーザのリクエストと異なるデータが入るので別の変数で管理したほうが良いかもしれないです
また Python 側では必ずスネークケースで受け取るようにしてください

参考サイト

0 件のコメント:

コメントを投稿