我正在将我的代码从JAX-RS
休息服务迁移到Django-Rest Framework
。JAX-RS 提供的一个很好的功能是Exception Mapper
可以将各种组件抛出的不同异常映射到泛型映射。
例如,对用户进行身份验证的 API 调用可能由于以下原因而失败:
- 用户名错误 -- 错误代码 1000
- 密码错误 -- 错误代码 1001
- 数据库已关闭 - 错误代码 1002
我可能想将"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"}
(并将响应发送到客户端。
谢谢
Django REST 框架通过中央异常处理程序处理验证异常以及其他异常。在 Django REST Framework 3.0 中,ValidationError
异常会上升到异常处理程序,因此您可以通过那里中继它们。在 Django REST Framework 2.4 中,验证错误处理是在序列化程序级别完成的,你必须在那里触发错误。
你需要在一个文件(my.app.views
(中定义你的异常处理程序,并在你的Django设置中设置处理程序。
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
在您的情况下,您将触发新的异常,而不是更改响应的状态代码。