Django REST Framework - Как быстро проверить права пользователя?

Я обычно использую permission_required Декоратор, чтобы быстро запретить пользователям доступ к представлению.

from django.contrib.auth.decorators import permission_required

@permission_required('my_app.view_mymodel',login_url='/sign_in/')
def my_view(request):
    ...

Теперь я использую DRF и пытаюсь найти правильный способ проверки прав пользователей. Прямо сейчас я использую DjangoModelPermissions это нормально, но так как он работает в соответствии с набором запросов определенного представления, иногда мне нужно проверить разрешения, которые не определены для набора запросов представления.

Есть ли способ быстро проверить разрешения, просто предоставив список строк perms?

Примечание: я знаю, что могу продлить BasePermission и определить свою собственную логику, но будет производить много классов.

1 ответ

У меня это работает так:

в ваших представлениях:

from rest_framework.decorators import api_view
from .permissions import permission_required

@api_view(['GET'])
@permission_required('permission')
def do_something(request):
    pass

в пределах разрешений:

from rest_framework.permissions import BasePermission
from rest_framework.decorators import permission_classes

def permission_required(perm):
    def has_permission(self, request, view):
        return request.user.has_perm(perm)
    Can = type(
        'WrappedAPIView',
        (BasePermission,),
        {'message': 'You can not do ' + perm,
        'has_permission': has_permission}
    )
    def decorator(func):
        func.permission_classes = [Can]
        return func
    return decorator

Вы можете достичь этого с помощью DRF декораторы (@api_view а также @permission_classes):

from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response

@api_view(['GET'])
# At first, you should define your view as an API view
# by using the @api_view decorator

@permission_classes((IsAuthenticated, ))
# With the @permission_classes decorator you can provide a tuple
# with the desired permissions for this view

def example_view(request, format=None):
    content = {
        'status': 'request was permitted'
    }
    return Response(content)

А теперь твой example_view могут быть доступны только аутентифицированным пользователям.

Другие вопросы по тегам