我正在尝试创建一个继承自permissions.BasePermission
的自定义权限类。我知道您可以覆盖自定义消息的message
属性,但是http状态也可以被覆盖吗?我想为过期的链接返回410。不知道我是否要尝试创建意外行为。
也许我的逻辑有更好的选择?基本上我想做的是向用户发送邀请链接,他们单击该链接,然后发出获取一些模型数据的请求。如果此模型数据是在10多天前创建的(它确实具有created_on
属性),我想返回410。我只是没有使用此逻辑设计任何东西,对我来说,它闻起来像是许可上课,但我可能是错的。
答案 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