ぷろぐら×でざいん

Django Rest FrameworkでExceptionをカスタマイズする

Django Rest FrameworkでExceptionをカスタマイズする

Django Rest FrameworkでExceptionをカスタマイズする

用途

Django rest frameworkで作成したAPIのURLに対してexample.api.com/?page=100など指定されると404エラーを返す仕様になっています。しかし、この場合は200で尚且つResponseをJson形式で返して欲しいという要望に応えるため、色々調べてみました。


コード

custom_exception_handler.py

# -*- coding: utf-8 -*-

from rest_framework.views import exception_handler


def custom_exception_handler(exc, context):
    response = exception_handler(exc, context)  # 最初にDjango rest frameworkのDefault Error handlerを呼びます。

    if response is not None and response.status_code == 404:
        response.status_code = 200
        response.data = {
            'count': 0,
            'next': None,
            'previous': None,
            'results': []
        }

    return response

settings.py

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'api.custom_exception_handler',  # ここに指定するだけ
    'DEFAULT_FILTER_BACKENDS': (
        'django_filters.rest_framework.DjangoFilterBackend',
        'rest_framework.filters.SearchFilter',
        'rest_framework.filters.OrderingFilter',
    ),
}

あとがき

そのPageがないってのは404で正しい気がするけど、確かにデータがないよという意味では200でNull返すのが正しい気もする。まぁーいずれにせよ、仕様書通りにAPIを叩いてくれれば嬉しい限りですね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です