1

Django Rest Framework の UserDetailsView のこのコードがあります。私はdjango 1.9とDRF 3を使用しています。

class UserDetailsView(RetrieveUpdateAPIView):
    """
    API endpoint that allows a user to be viewed or edited.
    """
    serializer_class = UserDetailsSerializer
    permission_classes = (IsAuthenticated,)

    def get_object(self):
        pk = self.kwargs.get('pk', None)
        if not pk or (pk == str(self.request.user.pk)):
            return self.request.user
        else:
            try:
                return get_object_or_404(User, id=pk)
            except ValueError:
                return get_object_or_404(User, username=pk) 

これらの設定に従ってdjangoロガーを構成しました。

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'simple': {
            'format': '[%(levelname)s]  %(message)s'
        },
    },
    'handlers': {
        'default': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': 'logs/backend_common.log',
            'maxBytes': 1024*1024*10,
            'backupCount': 10,
            'formatter': 'simple',
        },
        'request_handler': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': 'logs/backend_requests.log',
            'maxBytes': 1024*1024*10,
            'backupCount': 10,
            'formatter': 'simple',
        },
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
        }
    },
    'loggers': {
        '': {
            'handlers': ['default'],
            'propagate': True,
        },
        'django.request': {
            'handlers': ['request_handler', 'mail_admins'],
            'level': 'DEBUG',
            'propagate': False,
        }
    }
}

現在、django 4xx、5xx のすべてのエラー ステータス コードは、理想的には backend_requests.log ファイルに記録する必要があり、get_object_or_404 に起因する 404 ステータスを除きます。このビューに起因する 404 エラーもログに記録されるべきだと思います。どんな助けでも大歓迎です。

4

1 に答える 1

1

ここには実際には 2 つの問題があります。

1 つ目は、数日前に修正された Django のバグです。404 をログに記録していたコードの実行が少し早すぎました。Django の次のリリースは動作し、期待どおりに 404 がログに記録されます。

ただし、他の例外については、次のような問題があります。Django は、エラーの原因となった例外がコア リクエスト ハンドラにバブルアップされた場合、エラーをログに記録します。ただし、ビューまたは一部のミドルウェアが例外をキャッチして処理する場合、Django のコードのこの部分は呼び出されません。これがDRFで起こっていることです:

REST フレームワークのビューは、さまざまな例外を処理し、適切なエラー応答を返すように処理します。

処理される例外は次のとおりです。

  • APIExceptionREST フレームワーク内で発生したサブクラス。
  • Django のHttp404例外。
  • Django のPermissionDenied例外。

いずれの場合も、REST フレームワークは適切なステータス コードと content-type を含む応答を返します。応答の本文には、エラーの性質に関する追加の詳細が含まれます。

DRF は例外をキャッチし、応答オブジェクトを Django に返すため、Django は応答をレンダリングするだけで、エラーをログに記録しません。これは理にかなっています - 一部のミドルウェアは、元は 404 だったものを受け取り、代わりに別の応答を返す可能性があります (flatpageミドルウェアは良い例です)。

DRF によって処理された例外をログに記録する場合EXCEPTION_HANDLERは、DRF 構成で独自のものを指定するか、エラーをログに記録する独自のミドルウェアを作成できます。

5xx 例外は DRF によって処理されないことに注意してください。これらは Django まで伝播する必要があります。これらは今でもログに記録されているはずです。

于 2016-05-02T04:39:27.817 に答える