Джанго Требуется разрешение - PullRequest
2 голосов
/ 25 сентября 2019

Я пытаюсь проверить разрешения для некоторых запросов API.Я уже установил auth users и таблицы auth_user_user_permissions и auth_permissions, например view_company add_company bla bla, но проблема не в этом.Проблема в том, что когда я пытаюсь использовать декоратор, который

@permission_required('API.view_company', raise_exception=True)

мне сказал

AttributeError: 'CompanyDetailView' object has no attribute 'user'

Скорее всего, он ищет пользователя, потому что он собирается проверить user_permission, доступен ли онпросматривать компании или нет, но мое представление, которое я объявил в urls.py (путь ('companies //', CompanyDetailView.as_view ()),) не имеет пользовательского объекта, поэтому сообщение об ошибке вернуло атрибут error, как я могу решить эту проблему,Большое спасибо

Я пытался установить пример пользователя в классе представления, в начале это работало, потому что представление искал объект пользователя, я не могу использовать этот способ, потому что в каждом запросе есть разные пользователи

import rest_framework
from rest_framework import status
from django.contrib.auth.models import User
from rest_framework.views import APIView
from rest_framework.response import Response
from django.contrib.auth.decorators import permission_required

class CompanyDetailView(APIView):
    @permission_required('api.view_company', raise_exception=True)
    def get(self, request, id):
        try:
            request_data = {}
            request_data['request_method'] = request.method
            request_data['id'] = id
            companies = Company.objects.get(id=id)
            status = rest_framework.status.HTTP_200_OK
            return Response(companies, status)

бла бла бла

строка URL была =

path('companies/<int:id>/', CompanyDetailView.as_view()),

мое сообщение об ошибке было: AttributeError: 'CompanyDetailView' object has no attribute 'user'

когда я отлаживаю и вижу request.user.has_perm('view_company') возвращеноложь, но все же API дает ответы, предполагается, что вы не можете просматривать компании

Ответы [ 3 ]

2 голосов
/ 25 сентября 2019

Вы не можете легко использовать разрешения django с django rest framework.

есть учебник по разрешениям django-rest-framework по адресу:

https://www.django -rest-framework.org/api-guide/permissions/

1 голос
/ 25 сентября 2019

Механизм Django Views и Django Rest Framework Views немного отличается, поэтому у вас появляется это сообщение об ошибке.permission_required попытается получить доступ к полю user вашего просмотра, чтобы проверить разрешение пользователя, используя метод has_perm.Но у APIView не было поля user внутри него.

Чтобы избавиться от этого, вы можете использовать права доступа , предоставляемые Django Rest Framework для ограничения доступа.

Но если вы все еще хотите использовать встроенное разрешение Django для ограничения доступа к вашему представлению, вы можете создать класс Permission, который будет использовать has_perm для проверки разрешения пользователя.Например:

from rest_framework import permissions
from rest_framework import exceptions

class ViewCompanyPermission(permissions.BasePermission):
    def has_permission(self, request, view):
        if not request.user.has_perm('api.view_company'):
            raise exceptions.PermissionDenied("Don't have permission")
        return True

и использовать его в поле зрения через поле permission_classes:

class CompanyDetailView(APIView):
    permission_classes = (ViewCompanyPermission, )
    def get(self, request, id):
        try:
            request_data = {}
            request_data['request_method'] = request.method
            request_data['id'] = id
            companies = Company.objects.get(id=id)
            status = rest_framework.status.HTTP_200_OK
            return Response(companies, status)

Если вы хотите повторить поведение permission_required, вы можетесделать что-то вроде этого:

from rest_framework import permissions
from rest_framework import exceptions

def permission_required(permission_name, raise_exception=False):
    class PermissionRequired(permissions.BasePermission):
        def has_permission(self, request, view):
            if not request.user.has_perm(permission_name):
                if raise_exception:
                    raise exceptions.PermissionDenied("Don't have permission")
                return False
            return True
    return PermissionRequired

Тогда вы можете использовать это как:

class CompanyDetailView(APIView):
    permission_classes = (permission_required("api.view_company", raise_exception=True), )
    # ...
1 голос
/ 25 сентября 2019

На основе описания rights_required этот декоратор должен использоваться для представления функции, где первый аргумент равен request, и вы пытаетесь применить его для метода класса, где первый аргумент равен self вваш случай инстанса CompanyDetailView, так что вы получите ошибку.И вы должны использовать другой способ проверки прав доступа.

Вы можете прочитать некоторые примеры здесь: decorators-on-django-based-views-views

...