Как указать пользовательскую аутентификацию и разрешения для определенных действий в django rest framework - PullRequest
0 голосов
/ 25 октября 2019

У меня есть следующий код, определенный в наборе django rest framework:

class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    def list(self, request):
        return self.queryset.filter(user=self.request.user, is_published=True).order_by('-title')

    def retrieve(self, request, pk=None):
        queryset = Book.objects.all()
        book = get_object_or_404(queryset, pk=pk)
        serializer = BookSerializer(book)
        return Response(serializer.data)

    def get_permissions(self):
        """
        Instantiates and returns the list of permissions that this view requires.
        """
        if self.action == 'list':
            permission_classes = [IsAuthenticated]
        else:
            permission_classes = []
        return [permission() for permission in permission_classes]

    def get_authenticators(self):
        if self.action == 'list':
            authentication_classes = [TokenAuthentication]
        else:
            authentication_classes = []
        return [authentication() for authentication in authentication_classes]

Итак, в основном я хочу, чтобы кто-то захотел перейти к списку книг, которые он должен аутентифицировать себя с помощьюаутентификация токена, но когда кто-то хочет просто получить книгу, ему не нужно предоставлять какую-либо аутентификацию, и он может видеть детали книги.

Когда я использую этот код, метод self.action не работает в get_authenticators дляпо какой-то причине.

Как я могу обойти это. Ниже приведено сообщение об ошибке:

app_1  | Traceback (most recent call last):
app_1  |   File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
app_1  |     response = get_response(request)
app_1  |   File "/usr/local/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
app_1  |     response = self.process_exception_by_middleware(e, request)
app_1  |   File "/usr/local/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in _get_response
app_1  |     response = wrapped_callback(request, *callback_args, **callback_kwargs)
app_1  |   File "/usr/local/lib/python3.7/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
app_1  |     return view_func(*args, **kwargs)
app_1  |   File "/usr/local/lib/python3.7/site-packages/rest_framework/viewsets.py", line 114, in view
app_1  |     return self.dispatch(request, *args, **kwargs)
app_1  |   File "/usr/local/lib/python3.7/site-packages/rest_framework/views.py", line 480, in dispatch
app_1  |     request = self.initialize_request(request, *args, **kwargs)
app_1  |   File "/usr/local/lib/python3.7/site-packages/rest_framework/viewsets.py", line 135, in initialize_request
app_1  |     request = super().initialize_request(request, *args, **kwargs)
app_1  |   File "/usr/local/lib/python3.7/site-packages/rest_framework/views.py", line 382, in initialize_request
app_1  |     authenticators=self.get_authenticators(),
app_1  |   File "/wookie/books/views.py", line 60, in get_authenticators
app_1  |     if self.action == 'list':
app_1  | AttributeError: 'BookViewSet' object has no attribute 'action'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...