[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
でなければならない.
Reference
この問題について([Flask]Jsonデータ処理エラー), 我々は、より多くの情報をここで見つけました
https://velog.io/@cataiden/flask-json-error
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
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,
})
💡 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
でなければならない.Reference
この問題について([Flask]Jsonデータ処理エラー), 我々は、より多くの情報をここで見つけました https://velog.io/@cataiden/flask-json-errorテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol