我正在将代码从JAX-RS
休息服务迁移到Django-Rest Framework
。 JAX-RS提供的一个很好的功能是Exception Mapper
,其中各种组件抛出的不同异常可以映射到通用映射。
一个示例是,对用户进行身份验证的API调用可能会失败,原因如下:
我可能想映射" 1000"和" 1001"一个通用代码" 5325"前端/设备团队可以解释为"用户名和密码不匹配"
在JAX-RS中,映射是在REST层完成的。实际上,我可以抛出一种异常并将其映射到响应中发送的错误代码。
如何在Django中实现相同的目标?
例如:
def process_checkout(request):
//
if request.user.is_authenticated :
//then process checkout
else:
raise userNotAuthenticatedError
现在,middleware
应该映射" userNotAuthenticatedError"对于错误代码,构造一个JSON响应,例如{50000 :"user not authenticated"}
,并将响应发送给客户端。
由于
答案 0 :(得分:1)
Django REST Framework通过central exception handler处理验证异常以及其他异常。在Django REST Framework 3.0中,ValidationError
异常进入异常处理程序,因此您可以通过那里中继它们。在Django REST Framework 2.4中,验证错误处理是在序列化程序级别完成的,您必须在那里触发错误。
您需要在Django设置中的文件(my.app.views
)和set up the handler中定义异常处理程序。
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'my.app.views.exception_handler'
}
您需要确保设置异常处理程序。由于这是特定于具体情况的,以下内容应该有助于您入门:
from rest_framework.exceptions import ValidationError
from rest_framework.views import exception_handler
def custom_exception_handler(exc):
# Call REST framework's default exception handler to get
# the request to work from
response = exception_handler(exc)
if isinstance(exc, ValidationError):
# Always return a 422 status code for validation errors
response.status = 422
return response
在您的情况下,您将触发新的异常,而不是更改响应的状态代码。