Подтвердить что ты не робот

Как отключить проверку подлинности в Django REST Framework

Я работаю на сайте магазина, где каждый пользователь будет анонимным (ну, пока он не заплатит как минимум), и я пытаюсь использовать Django REST Framework для обслуживания API продукта, но он продолжает жаловаться:

"detail": "Authentication credentials were not provided."

Я нашел некоторые настройки, связанные с аутентификацией, но я не мог найти ничего подобного ENABLE_AUTHENTICATION = True. Как просто отключить проверку подлинности и позволить любому посетителю сайта получить доступ к API?

4b9b3361

Ответ 1

Вы можете указать пустые значения по умолчанию для классов permission и authentication в ваших настройках.

REST_FRAMEWORK = {
    # other settings...

    'DEFAULT_AUTHENTICATION_CLASSES': [],
    'DEFAULT_PERMISSION_CLASSES': [],
}

Ответ 2

Вы также можете отключить аутентификацию для определенного класса или метода, просто не заполняйте декораторы для конкретного метода.

from rest_framework.decorators import authentication_classes, permission_classes

@api_view(['POST'])    
@authentication_classes([])
@permission_classes([])
def items(request):
   return Response({"message":"Hello world!"})

Ответ 3

Если вы используете APIView, вы можете создать разрешение для представления, пример ниже:

urls.py

url(r'^my-endpoint', views.MyEndpoint.as_view())

permissions.py

class PublicEndpoint(permissions.BasePermission):
    def has_permission(self, request, view):
        return True

views.py

from permissions import PublicEndpoint

class MyEndpoint(APIView):

    permission_classes = (PublicEndpoint,)

    def get(self, request, format=None):
        return Response({'Info':'Public Endpoint'})

Ответ 4

Вы также можете применить его на одной конкретной конечной точке, применив его к классу или методу. Просто нужно применить django rest framework AllowAny разрешение к определенному методу или классу.

views.py

from rest_framework.permissions import AllowAny

from .serializers import CategorySerializer
from catalogue.models import Category   

@permission_classes((AllowAny, ))
class CategoryList(generics.ListAPIView):
    serializer_class = serializers.CategorySerializer
    queryset = Category.objects.all()

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