概要
デコレータと正規表現を使って実現しています
正規表現はキャメルケースをスネークケースに変更することを想定しています
一応変換後のスネークケースのキーが存在しない場合にだけ追加するようにしています
また 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 件のコメント:
コメントを投稿