APIはエラー時にJSONオブジェクトを返しますが、ステータスコードはHTTP 200
:
response = JsonResponse({'status': 'false', 'message': message})
return response
エラーを示すために応答コードを変更するにはどうすればよいですか?
JsonResponse
は通常、HTTP 200
のステータスコードである'OK'
を返します。エラーを示すために、JsonResponse
のサブクラスであるHttpResponse
にHTTPステータスコードを追加できます。
response = JsonResponse({'status':'false','message':message}, status=500)
実際のステータスを返す
JsonResponse(status=404, data={'status':'false','message':message})
JsonResponse
のステータスコードを変更するには、次のようにします。
response = JsonResponse({'status':'false','message':message})
response.status_code = 500
return response
Python組み込みHTTPライブラリには、 HTTPStatus と呼ばれる新しいクラスがあります。これは Python 3.5 以降のものです。 status
を定義するときに使用できます。
from http import HTTPStatus
response = JsonResponse({'status':'false','message':message}, status=HTTPStatus.INTERNAL_SERVER_ERROR)
HTTPStatus.INTERNAL_SERVER_ERROR.value
の値は500
です。誰かがあなたのコードを読むとき、HTTPStatus.<STATUS_NAME>
のような整数値を定義するよりも、500
のような何かを定義するほうがよいでしょう。すべての IANA-registered ステータスコードをpython library here から表示できます。
Sayseからのこの回答は機能しますが、文書化されていません。 ソースを見ると 残りの**kwargs
スーパークラスコンストラクター、HttpStatusに。ただし、docstringでは、それについて言及していません。キーワード引数がスーパークラスコンストラクターに渡されると仮定するのが慣例かどうかはわかりません。
次のように使用することもできます。
JsonResponse({"error": "not found"}, status=404)
ラッパーを作成しました:
from Django.http.response import JsonResponse
class JsonResponseWithStatus(JsonResponse):
"""
A JSON response object with the status as the second argument.
JsonResponse passes remaining keyword arguments to the constructor of the superclass,
HttpResponse. It isn't in the docstring but can be seen by looking at the Django
source.
"""
def __init__(self, data, status=None, encoder=DjangoJSONEncoder,
safe=True, json_dumps_params=None, **kwargs):
super().__init__(data, encoder, safe, json_dumps_params, status=status, **kwargs)