РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
542 of 818 menu

Декоратор permission_required

Декоратор permission_required применяется к функции представления и проверяет, обладает ли текущий пользователь указанными разрешениями. Если пользователь не авторизован или не имеет необходимых разрешений, декоратор перенаправляет его на страницу входа (если не задан параметр login_url) или возвращает ошибку 403 (Forbidden). Основные параметры декоратора: perm (обязательный) - строка или список строк с названиями разрешений в формате "app_label.codename"; login_url - URL для перенаправления неавторизованных пользователей; raise_exception - если установлен в True, при отсутствии разрешений будет вызвано исключение PermissionDenied.

Синтаксис

from django.contrib.auth.decorators import permission_required @permission_required(perm, login_url=None, raise_exception=False) def my_view(request): # Код представления pass

Пример . С одним разрешением

Давайте ограничим доступ к представлению только для пользователей, имеющих разрешение 'can_publish_article' в приложении 'blog':

from django.contrib.auth.decorators import permission_required from django.shortcuts import render from blog.models import Article @permission_required('blog.can_publish_article') def publish_article(request, article_id): article = Article.objects.get(id=article_id) article.status = 'published' article.save() return render(request, 'blog/success.html')

Пример . С несколькими разрешениями

Декоратор также позволяет проверить наличие сразу нескольких разрешений. Для этого передайте список или кортеж с названиями разрешений:

from django.contrib.auth.decorators import permission_required from django.shortcuts import render from blog.models import Article @permission_required(['blog.can_publish_article', 'blog.can_edit_article']) def manage_article(request, article_id): article = Article.objects.get(id=article_id) # Код управления статьёй return render(request, 'blog/manage.html')

Пример . С перенаправлением на свою страницу входа

Если вы хотите перенаправлять пользователей на свою страницу входа вместо стандартной, используйте параметр login_url:

from django.contrib.auth.decorators import permission_required from django.shortcuts import render @permission_required('blog.can_delete_article', login_url='/custom-login/') def delete_article(request, article_id): # Код удаления статьи return render(request, 'blog/delete.html')

Пример . С исключением PermissionDenied

Если вам нужно не перенаправлять пользователя, а сразу вернуть ошибку 403 при отсутствии разрешений, используйте параметр raise_exception:

from django.contrib.auth.decorators import permission_required from django.http import JsonResponse @permission_required('blog.can_view_analytics', raise_exception=True) def analytics_view(request): data = {'visitors': 1000, 'views': 5000} return JsonResponse(data)

Пример . Использование с Class-Based Views

Декоратор permission_required можно применять и к представлениям на основе классов, используя декоратор method_decorator:

from django.contrib.auth.decorators import permission_required from django.utils.decorators import method_decorator from django.views.generic import TemplateView @method_decorator(permission_required('blog.can_edit_article'), name='dispatch') class EditArticleView(TemplateView): template_name = 'blog/edit_article.html' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['article_id'] = self.kwargs['article_id'] return context

Смотрите также

  • декоратор login_required,
    который требует авторизации пользователя для доступа к представлению
  • декоратор user_passes_test,
    который проверяет произвольное условие для доступа к представлению
  • метод пользователя has_perm,
    который проверяет наличие конкретного разрешения у пользователя
  • метод пользователя has_perms,
    который проверяет наличие нескольких разрешений у пользователя
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить