Ответ 1
Вы можете указать пустые значения по умолчанию для классов permission и authentication в ваших настройках.
REST_FRAMEWORK = {
# other settings...
'DEFAULT_AUTHENTICATION_CLASSES': [],
'DEFAULT_PERMISSION_CLASSES': [],
}
Я работаю на сайте магазина, где каждый пользователь будет анонимным (ну, пока он не заплатит как минимум), и я пытаюсь использовать Django REST Framework для обслуживания API продукта, но он продолжает жаловаться:
"detail": "Authentication credentials were not provided."
Я нашел некоторые настройки, связанные с аутентификацией, но я не мог найти ничего подобного ENABLE_AUTHENTICATION = True
. Как просто отключить проверку подлинности и позволить любому посетителю сайта получить доступ к API?
Вы можете указать пустые значения по умолчанию для классов permission и authentication в ваших настройках.
REST_FRAMEWORK = {
# other settings...
'DEFAULT_AUTHENTICATION_CLASSES': [],
'DEFAULT_PERMISSION_CLASSES': [],
}
Вы также можете отключить аутентификацию для определенного класса или метода, просто не заполняйте декораторы для конкретного метода.
from rest_framework.decorators import authentication_classes, permission_classes
@api_view(['POST'])
@authentication_classes([])
@permission_classes([])
def items(request):
return Response({"message":"Hello world!"})
Если вы используете 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'})
Вы также можете применить его на одной конкретной конечной точке, применив его к классу или методу. Просто нужно применить 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()
Вы можете добиться того же результата, используя пустой список или кортеж для параметра разрешений, но вы можете счесть полезным указать этот класс, потому что он делает намерение явным.