我可以在rest_framework权限类中覆盖http状态吗?

时间:2019-05-03 16:31:10

标签: django django-rest-framework

我正在尝试创建一个继承自permissions.BasePermission的自定义权限类。我知道您可以覆盖自定义消息的message属性,但是http状态也可以被覆盖吗?我想为过期的链接返回410。不知道我是否要尝试创建意外行为。

也许我的逻辑有更好的选择?基本上我想做的是向用户发送邀请链接,他们单击该链接,然后发出获取一些模型数据的请求。如果此模型数据是在10多天前创建的(它确实具有created_on属性),我想返回410。我只是没有使用此逻辑设计任何东西,对我来说,它闻起来像是许可上课,但我可能是错的。

2 个答案:

答案 0 :(得分:1)

403比 权限被拒绝 错误(状态代码为410)非常有意义。

除此之外,您无法以DRF方式更改DRF中的 Permission Denied 错误的状态代码。


获得解决方案的解决方法

创建一个自定义API异常类,如下:

from rest_framework.exceptions import APIException
from rest_framework import status


class GenericAPIException(APIException):
    """
    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 permissions


class FooPermission(permissions.BasePermission):
    def has_permission(self, request, view):
        if some_condition:
            raise GenericAPIException(detail="exception message", status_code=410)
        return True

答案 1 :(得分:0)

如果有人想知道,您也可以这样做

from rest_framework.permissions import BasePermission
from rest_framework.exceptions import ValidationError


class FooPermission(BasePermission):
    def has_permission(self, request, view):
        if some_condition:
            raise ValidationError(detail="Exception Message", code=410)
        return True

从DRF文档中:https://www.django-rest-framework.org/api-guide/exceptions/#validationerror