У меня есть следующий код, определенный в наборе 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'