# Магические строки
if request.method in ['GET', 'HEAD', 'OPTIONS']:
return True
# Константа SAFE_METHODS
from rest_framework.permissions import SAFE_METHODS
if request.method in SAFE_METHODS:
return True
3. Кастомное сообщение об ошибке разрешения
Из лекции (старое)
Современное (DRF 3.0+)
# Нет кастомного сообщения
class IsOwnerOrReadOnly(BasePermission):
def has_object_permission(self, request, view, obj):
if request.method in ['GET', 'HEAD', 'OPTIONS']:
return True
return obj.owner == request.user
# При отказе всегда: "You do not have permission..."
# С кастомным сообщением
class IsOwnerOrReadOnly(BasePermission):
message = "Редактировать объект может только его владелец."
def has_object_permission(self, request, view, obj):
if request.method in SAFE_METHODS:
return True
return obj.owner == request.user
4. Проверка времени — наивный vs timezone-aware datetime
Из лекции (старое)
Современное
# Из лекции — наивный datetime (не учитывает tz)
from datetime import datetime
class IsWorkHour(BasePermission):
def has_object_permission(self, request, view, obj):
current_hour = datetime.now().hour
return 9 <= current_hour < 18
# Современно — с учётом timezone
from django.utils import timezone
class IsWorkHour(BasePermission):
message = "Доступ доступен только с 9:00 до 18:00."
def has_permission(self, request, view):
# timezone-aware, учитывает TIME_ZONE из settings
current_hour = timezone.localtime().hour
return 9 <= current_hour < 18
5. Проверка is_staff vs is_superuser
Паттерн
Значение
request.user.is_staff
Пользователь может заходить в Django Admin. Используется в IsAdminUser. Рекомендуется для обычного административного доступа.
request.user.is_superuser
Суперпользователь — все разрешения по умолчанию. Редко нужен явно в permissions.