Декоратор 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,
который проверяет наличие нескольких разрешений у пользователя