我正在将Python 3.6与Django 1.11.9和rest_framework 3.6.2结合使用。
我有一个视图(APIView),只有成功通过给定的HasUnlimitedAccesPermission检查的某些用户才能访问该视图。如果无法通过后者,我会提出一个PermissionDenied,其中包含我选择的有关错误的详细消息,该错误将传递给前端。到目前为止,到目前为止,通过使用“ permission_classes”修饰符将HasUnlimitedAccessPermission应用于我的视图,所有这些都可以轻松实现(是的,我在这里使用基于function_view的视图)。
现在,我要实现的是将一个附加属性传递给我的错误响应JSON(当用户未能通过权限测试时)。该属性将是“ error_id”属性,该属性将使前端开发人员能够根据“ error_id”值来调整错误显示。响应JSON的示例为:
{
"error": "To enjoy this feature, go pick one of our pay offer!",
"error_id": "no_unlimited_access"
}
关于如何实现这一目标的任何想法?
答案 0 :(得分:0)
您的问题可以使用中间件问题来解决。
我建议您构建自定义中间件。因此,自定义中间件可以帮助您根据需要创建响应。只需将中间件插入django应用程序即可。
中了解更多信息答案 1 :(得分:0)
将自定义例外类定义为
from rest_framework.serializers import ValidationError
from rest_framework import status
class CustomAPIException(ValidationError):
"""
raises API exceptions with custom messages and custom status codes
"""
status_code = status.HTTP_400_BAD_REQUEST
default_code = 'error'
def __init__(self, detail, status_code=None):
self.detail = detail
if status_code is not None:
self.status_code = status_code
并在视图中用作
from rest_framework import status
def my_view(request):
if some_condition:
error_msg = {
"error": "To enjoy this feature, go pick one of our pay offer!",
"error_id": "no_unlimited_access"
}
raise CustomAPIException(error_msg)
答案 2 :(得分:0)
好的,感谢贝尔·布朗的评论和杰林·彼得·乔治的回答(由rest_framework源代码完成),我做到了:
1)创建了一个自定义PermissionDenied异常:
class CustomPermissionDenied(PermissionDenied):
def __init__(self, detail=None, code=None, error_id=None):
super().__init__(detail=detail, code=code)
self.error_id = error_id
例如,在HasUnlimitedAccessPermission中引发的:
raise CustomPermissionDenied(detail=_("To use this feature, subscribe to one of our plans."),
error_id="no_unlimited_access")
2)在custom_exception_handler(我已经有其他用途)中,在椭圆之间添加了行
def custom_exception_handler(exc, context):
...
error_id = getattr(exc, "error_id", None)
if error_id is not None:
new_response_data["error_id"] = error_id
...
response.data = new_response_data
return response
这就是我想要的错误响应格式。感谢大家的帮助!