[Flask]Jsonデータ処理エラー


Error


FlaskからJsonデータを受信する方法は、request.jsonおよびrequest.get_json()である.
このうち私が使っているのはrequest.jsonで、コードは以下の通りです.
from flask import request

@app.route('/test/method/<id>')
def method_test(id):
	return jsonify({
    	'request.method': request.method,
        'request.args': request.args,
        'request.form': request.form,
        'request.json': request.json,
        })
その後、Postmanを用いてGETリクエストが送信され、400 Bad Requestが応答として受信される.
Jsonデータは一切伝達されていないため、200とともに空のカッコを返す予定だが、実際にはそうではない.
またjsonifyを使用してもcontent-typeはapplication/jsonではなくtext/htmlである.
Query Stringがコミットされていない場合は、要求されます.Argsは空のカッコを返し、Bodyを渡さない場合は要求します.formも空のカッコを返します.
ではJsonを出さなければrequest.jsonはなぜ空のカッコではなく400を返したのですか?
また、200と一緒に希望の結果を得るにはどうすればいいですか?

Solution


💡 on_json_loading_failed()


FlaskでMIME typeがapplication/jsonの場合、Json文字列を送信しない場合は400 Bad Requestを返します.
これは、Jsonデータの解析中に空の文字列が解析に失敗し、on_json_loading_failed()関数が自動的に実行されるためである.on_json_loading_failed()関数は、Jsonデータに対するDecodeが失敗した場合、400 Bad Requestを返すことを実現する.
最終的に、空のJsonデータに対する400 Bad Request応答は、解析の失敗によるon_json_loading_failed()関数の実行である.

💡 define


すなわち、この関数を再定義して、必要な結果を得ることができることを意味します.on_json_loading_failed()関数を再定義し、空のJsonデータの内部操作を所望の値を返すように変更すると、空のカッコを直接返すことも、ログを残すために使用することもできます.
以下は、Jsonデータが空の文字列の場合にカッコを返すように変更したコードです.
from flask import request

# 빈 curly brackets 를 반환하는 function
def on_json_loading_failed_return_dict(e):
	return {}

@app.route('/test/method/<id>')
def method_test(id):

	# request.on_json_loading_failed 와 연결
	request.on_json_loading_failed = on_json_loading_failed_return_dict
    
    return jsonify({
    'request.method': request.method,
    'request.args': request.args,
    'request.form': request.form,
    'request.json': request.json,
    })
空のカッコを返す関数on_json_loading_failed_return_dictを再定義し、requestのon json loading failedに関連付けられたコードを追加しました.
これで、Jsonデータを使用して空の文字列を転送しても、200 OKとともにカッコを返すことができます.

💡 silent=True

get_json()を使用してJsonデータを受信する場合、silentパラメータを使用して解析失敗に対して簡単に例外処理を実行することができる.silentのデフォルト値はFalseであり、これをTrueに設定すると、Jsonデータの解析に失敗したときに間違いなくNoneが返されます.
print request.get_json(silent=True)
しかし、on_json_loading_failed()関数を再定義する方法とは異なり、内部動作に従ってカスタマイズすることはできず、MIME typeはtext/htmlでなければならない.