首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Django Rest Framework中包括请求数据自定义异常处理程序响应数据

在Django Rest Framework中包括请求数据自定义异常处理程序响应数据
EN

Stack Overflow用户
提问于 2015-06-11 15:59:40
回答 1查看 3.7K关注 0票数 3

技术使用:

http://www.django-rest-framework.org

例外: http://www.django-rest-framework.org/api-guide/exceptions/

在自定义的rest_framework文件中包括了exceptions.py默认示例:

代码语言:javascript
运行
复制
from rest_framework.views import exception_handler

import sys

def custom_exception_handler(exc, context=None):

    # Call REST framework's default exception handler first,
    # to get the standard error response.
    response = exception_handler(exc)

    # Now add the HTTP status code to the response and rename detail to error
    if response is not None:
        response.data['status_code'] = response.status_code
        response.data['request'] = request
        response.data['error'] = response.data.get('detail')
        del response.data['detail']

    return response

这发送基本错误信息,如"Http404“等,但没有请求数据,如ip地址等。

将我的请求添加到回复中的最佳方法?提前谢谢。

更新(并已解决):

因此,我最初尝试使用DjangoRestFramework 2.4.x解决这个问题,但该版本没有自定义异常处理程序的请求或上下文数据选项。升级到3.1.3可以方便地将数据添加到响应中。新代码现在看起来如下(使用3.1.3版本):

代码语言:javascript
运行
复制
def custom_exception_handler(exc, request):

# Call REST framework's default exception handler first,
# to get the standard error response.
response = exception_handler(exc, request)

# Send error to rollbar
rollbar.report_exc_info(sys.exc_info(), request)

# Now add the HTTP status code to the response and rename detail to error
if response is not None:
    response.data['status_code'] = response.status_code
    response.data['error'] = response.data.get('detail')
    del response.data['detail']

return response
EN

回答 1

Stack Overflow用户

发布于 2015-06-11 16:17:58

这应该适用于你的案子。

代码语言:javascript
运行
复制
from rest_framework.views import exception_handler

import sys

def custom_exception_handler(exc, context=None):

    # Call REST framework's default exception handler first,
    # to get the standard error response.
    response = exception_handler(exc)

    # Now add the HTTP status code to the response and rename detail to error
    if response is not None:
        response.data['status_code'] = response.status_code
        response.data['request'] = context['request']
        response.data['error'] = response.data.get('detail')
        del response.data['detail']

    return response

您可以从传递给request的上下文中访问custom_exception_handler。这是在DRF 3.1.0中添加的。还请参考已解析的问题

如果使用的是request,则在异常处理程序的上下文中不存在 DRF<3.1 。您可以升级到DRF 3.1.3(PyPI中的最新版本),然后在上下文中轻松地访问.

取自DRF 3.1.1源代码:

代码语言:javascript
运行
复制
def get_exception_handler_context(self):
    """
    Returns a dict that is passed through to EXCEPTION_HANDLER,
    as the `context` argument.
    """
    return {
        'view': self,
        'args': getattr(self, 'args', ()),
        'kwargs': getattr(self, 'kwargs', {}),
        'request': getattr(self, 'request', None)
    }

此外,还需要在settings.py文件中配置异常处理程序。

代码语言:javascript
运行
复制
REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler'
}

如果未指定,则'EXCEPTION_HANDLER'设置默认为REST框架提供的标准异常处理程序:

代码语言:javascript
运行
复制
REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler'
}

注:

只有由引发的异常生成的响应才会调用异常处理程序。它不会用于视图直接返回的任何响应,例如在序列化程序验证失败时由泛型视图返回的HTTP_400_BAD_REQUEST响应。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30785818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档