Я не уверен, как обращаться с разрешениями в подробных видах (например, api/teams/<int:pk>
). Предположим, у меня есть собственный класс разрешений, который должен разрешать доступ, если запрашивающий пользователь находится в запрашиваемой команде.
что-то вроде:
class IsInTeam(BasePermission):
def has_permission(self, request, view):
# should I implement this at all?
def has_object_permission(self, request, view, team):
return team.hasMember(request.user)
Поскольку вызывается has_object_permission
в любом случае (поскольку представления «сток» проверяют разрешения при вызове get_object
в соответствии с документами ):
Примечание : Уровень экземпляра has_object_permission
метод будет вызываться только в том случае, если проверки на уровне представления has_permission
уже пройдены. Также обратите внимание, что для запуска проверок на уровне экземпляра код представления должен явно вызывать .check_object_permissions(request, obj)
. Если вы используете общие c представления, то это будет обработано для вас по умолчанию.
Теперь, согласно этому, has_object_permission
будет проверяться только, если has_permission
вернул True
. Хотя это имеет смысл, можно утверждать, что, поскольку это представление строго основано на CRUD
операциях над конкретным c объектом, обозначенным pk
, все необходимые проверки могут выполняться в методе has_permission
.
Вопрос : Это будет плохой практикой? Если так, то почему? Единственная причина, по которой я могу придумать, состоит в том, что в has_permission
нужно было бы проверить, существует ли объект вообще. Это было бы несколько запутанным, поскольку проверки разрешений не должны проверять, существует ли объект.