web-dev-qa-db-ja.com

DjangoでJsonResponseのステータスを変更する方法

APIはエラー時にJSONオブジェクトを返しますが、ステータスコードはHTTP 200

response = JsonResponse({'status': 'false', 'message': message})
return response

エラーを示すために応答コードを変更するにはどうすればよいですか?

43

JsonResponseは通常、HTTP 200のステータスコードである'OK'を返します。エラーを示すために、JsonResponseのサブクラスであるHttpResponseにHTTPステータスコードを追加できます。

response = JsonResponse({'status':'false','message':message}, status=500)
103
Selcuk

実際のステータスを返す

JsonResponse(status=404, data={'status':'false','message':message})
12
Sayse

JsonResponseのステータスコードを変更するには、次のようにします。

response = JsonResponse({'status':'false','message':message})
response.status_code = 500
return response
6

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 から表示できます。

0

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)
0
Benjamin Atkin