如何在Django REST Framework中禁用身份验证

时间:2014-11-23 03:15:31

标签: authentication django-rest-framework

我正在商店网站上工作,每个用户都将是匿名的(好吧,至少需要付费的时间),我正在尝试使用Django REST Framework提供产品API,但它一直抱怨:

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

我找到了一些与身份验证相关的设置,但我找不到像ENABLE_AUTHENTICATION = True这样的内容。如何简单地禁用身份验证,让站点的任何访问者访问API?

7 个答案:

答案 0 :(得分:42)

您可以在设置中为permissionauthentication类提供空的默认值。

REST_FRAMEWORK = {
    # other settings...

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

答案 1 :(得分:32)

您还可以禁用特定类或方法的身份验证,只需保留特定方法的装饰器。

from rest_framework.decorators import authentication_classes, permission_classes

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

答案 2 :(得分:5)

您也可以通过在类或方法上应用它来在一个特定端点上应用它。只需要将 django rest框架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()

通过使用空列表或元组进行权限设置,您可以获得相同的结果,但您可能会发现指定此类很有用,因为它使意图明确。

答案 3 :(得分:4)

如果使用API​​View,您可以为视图创建权限,例如:

<强> 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 :(得分:2)

要全局启用身份验证,请将其添加到您的django设置文件中:

'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.TokenAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
    'rest_framework.permissions.IsAuthenticated',
),

然后将以下修饰符添加到您的方法中,以启用未经身份验证的访问

from rest_framework.decorators import authentication_classes, permission_classes

@api_view(['POST'])
@authentication_classes([])
@permission_classes([])
def register(request):
  try:
    username = request.data['username']
    email = request.data['email']
    password = request.data['password']
    User.objects.create_user(username=username, email=email, password=password)
    return Response({ 'result': 'ok' })
  except Exception as e:
    raise APIException(e)

答案 5 :(得分:2)

如果您要为某个基于类的视图禁用身份验证,则可以使用

class PublicEndPoint(APIView):
    authentication_classes = [] #disables authentication
    permission_classes = [] #disables permission
    
    def get(self, request):
        pass

当您希望公开特定端点时,这很有用。

答案 6 :(得分:1)

这里是一种仅出于开发目的而启用API表单的替代方法:

settings.py

T

Django REST框架v3.11.0