显示由Rest Framework导致的Django 500错误中的request.DATA

时间:2014-07-23 16:39:47

标签: django debugging django-rest-framework

我使用Django Rest Framework构建了一个API,但是我遇到了错误记录的问题,它不会显示从AJAX调用发送到API的原始POST数据。现在我知道Rest Framework使用request.DATA来解析POST数据,但是我很难在Django错误日志中获取这些数据,这使得调试实时应用程序变得很困难。

例如,我发送以下POST呼叫:

...    
Request Payloadview source
{start:2014-07-16, end:2014-08-18}
    end: "2014-08-18"
    start: "2014-07-16"

在Django错误日志中,我得到:

...
GET: No GET data
POST: No POST data
FILES: No FILES data
...

如果我能在错误日志中看到哪些数据最初是通过AJAX调用提交的,那就太棒了。 我试图自定义Rest Framework异常处理程序,但它不能捕获Django中发生的500个错误。

2 个答案:

答案 0 :(得分:3)

在settings.py中:

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'core.exceptions.exception_handler',
}

处理程序:

def exception_handler(exc, drf_request=None):
    """
    Replace request.POST with drf_request.DATA so Sentry
    can log request properly.

    @param exc: Exception
    @param drf_request: Request
    @return: None
    """
    response = views.exception_handler(exc)
    if response is None and drf_request is not None \
            and drf_request.method not in ['GET', 'HEAD', 'OPTIONS']:
        request = get_request()
        request.POST = drf_request.DATA

    return response

答案 1 :(得分:2)

有一个适用于Django 1.9+和Rest Framework 3.4的版本

from rest_framework import permissions
from rest_framework.views import exception_handler


def custom_exception_handler(exc, context):
    response = exception_handler(exc, context)

    if response is None and context['request'].method not in permissions.SAFE_METHODS:
        context['request']._request.POST = context['request'].data

return response