使用的技术:
http://www.django-rest-framework.org
例外: http://www.django-rest-framework.org/api-guide/exceptions/
自定义exceptions.py文件中包含rest_framework默认示例:
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):
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
答案 0 :(得分:4)
这适用于您的情况。
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 中。另请参阅此issue解决的问题。
如果您使用DRF< 3.1,则异常处理程序的上下文中不会有request
。您可以升级到DRF 3.1.3(PyPI中的最新版本),然后轻松访问上下文中的request
。
取自DRF 3.1.1源代码:
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
文件中配置异常处理程序。
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler'
}
如果未指定,'EXCEPTION_HANDLER'
设置默认为REST框架提供的标准异常处理程序:
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler'
}
注意:强>
只会为生成的响应调用异常处理程序 提出例外。它不会用于任何返回的响应 直接通过视图,例如HTTP_400_BAD_REQUEST响应 序列化程序验证失败时,通用视图返回。