Ответ
Классы разрешений (Permission classes) в Django REST Framework (DRF) — это основной механизм для определения и принудительного применения политик доступа к эндпоинтам API.
Они определяют, имеет ли аутентифицированный (или анонимный) пользователь право выполнять определенное действие (например, GET, POST, DELETE) над объектом.
Ключевые задачи:
- Гранулярный контроль доступа: Позволяют создавать гибкие правила. Например, разрешить чтение всем, а редактирование — только автору записи или администратору.
- Переиспользование логики: Правила доступа выносятся в отдельные классы, которые можно применять к разным
View. - Безопасность: Защищают данные от несанкционированного доступа и модификации.
Как это работает:
DRF проверяет разрешения, вызывая методы .has_permission() (для доступа к представлению) и .has_object_permission() (для доступа к конкретному объекту).
Пример: Только администратор может редактировать
from rest_framework.permissions import BasePermission, SAFE_METHODS
class IsAdminUserOrReadOnly(BasePermission):
"""
Разрешает полный доступ администраторам и доступ только для чтения
(GET, HEAD, OPTIONS) всем остальным пользователям.
"""
def has_permission(self, request, view):
# Разрешить безопасные методы всем
if request.method in SAFE_METHODS:
return True
# Разрешить любые методы, если пользователь — администратор
return bool(request.user and request.user.is_staff)
# Применение в View
from rest_framework.views import APIView
from rest_framework.response import Response
class MyDataView(APIView):
permission_classes = [IsAdminUserOrReadOnly]
def get(self, request):
return Response({"data": "some public data"})
def post(self, request):
# Этот метод будет доступен только администраторам
return Response({"status": "data created"}) Ответ 18+ 🔞
А, ну вот, слушай, подъехал я тут к теме про классы разрешений в Django REST Framework, а ты сидишь такой и думаешь: «Ну и нахуя мне это, я ж просто хочу API сделать». А потом, блядь, какой-нибудь левый пользователь тебе весь бэкенд в ноль отредактирует, и ты будешь сидеть с круглыми глазами, типа «ой, ёпта, а как так-то?».
Так вот, классы разрешений в DRF — это, по сути, такие здоровенные вышибалы на входе в твой API-бар. Они смотрят на каждого, кто пришёл, и решают: этому можно только посмотреть меню (GET), а этому можно ещё и заказать (POST), а этому, который админ, — вообще за бар зайти и бухло бесплатно наливать.
Зачем это, блядь, нужно:
- Чтобы не было пиздеца. Представь, любой аноним может удалить все твои записи. Это пиздец. А с разрешениями — нет, не может.
- Чтобы правила были умными. Например, свою запись в блоге ты можешь и удалить, и изменить, а чужую — только прочитать. Всё это описывается тут.
- Чтобы не повторяться. Написал один раз класс-вышибалу и кидаешь его на все входы, где нужны одинаковые правила. Красота, а не жизнь.
Как это, сука, работает:
DRF, когда к нему стучится запрос, сначала спрашивает у этих классов: «Мужики, пропускать?». Сначала спрашивает про доступ к виду вообще (has_permission), а если дело дошло до конкретной записи в базе (например, пост с id=5), то спрашивает ещё раз, но уже про этот объект (has_object_permission).
Пример: Чтобы только админ мог всё, а остальные — только смотреть
Смотри, как это выглядит в коде. Всё логично, блядь.
from rest_framework.permissions import BasePermission, SAFE_METHODS
class IsAdminUserOrReadOnly(BasePermission):
"""
Админам — зелёный свет на всё.
Всем остальным — только смотреть (GET, HEAD, OPTIONS), руками не трогать.
"""
def has_permission(self, request, view):
# Если метод безопасный (только чтение) — пускаем всех, даже анонимов
if request.method in SAFE_METHODS:
return True
# А если метод опасный (POST, PUT, DELETE) — пускаем только админа
# Проверяем, есть ли пользователь и стоит ли у него галочка is_staff
return bool(request.user and request.user.is_staff)
# А теперь применяем эту хуйню во вьюхе
from rest_framework.views import APIView
from rest_framework.response import Response
class MyDataView(APIView):
# Вешаем нашего вышибалу на эту вьюху
permission_classes = [IsAdminUserOrReadOnly]
def get(self, request):
# Сюда пустит всех, потому что GET — безопасный метод
return Response({"data": "какие-то публичные данные"})
def post(self, request):
# А сюда, сука, попробуй зайди без прав админа — получишь по ебалу (403 Forbidden)
return Response({"status": "данные созданы"})
Вот и вся магия. Написал один класс, и теперь у тебя не какой попало распиздяй может писать в базу, а только избранные. А то без этого — один хуй, рано или поздно, накосячишь.