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
могут быть доступны только аутентифицированным пользователям.