如何禁用Django REST框架中的身份验证

问题描述:

我正在开发一个商店网站,每个用户都将是匿名的(直到至少需要付款),并且我正在尝试使用Django REST框架服务于产品的API,但它一直在抱怨:如何禁用Django REST框架中的身份验证

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

我发现与身份验证一些设置,但我无法找到像ENABLE_AUTHENTICATION = True东西。我如何简单地禁用身份验证,并让任何访问者访问该站点的API?

+0

相关问题:http://*.com/questions/35970970/django-rest-framework-permission-classes-of-viewset-method – 2017-02-04 16:09:13

您可以在设置中给出permissionauthentication类的空默认值。

REST_FRAMEWORK = { 
    # other settings... 

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

我如何跳过只有一个类的DRF认证 – roanjain 2016-04-28 06:16:02

+2

@roanjain添加属性'authentication_classes = []' - 设置字典,顾名思义,仅仅是默认设置。 – OJFord 2016-07-03 19:38:13

+0

@OllieFord这听起来像是一场灾难。如果某人将默认身份验证设置为“无”,并且稍后其他人忘记为任何端点指定任何授权类,则该端点将可能不受保护。我想继续使用“黑名单”的做法,而不是“白名单”,只需指定一个神奇的匿名身份验证和权限类给我想要打开的特定端点。 – 2017-01-01 04:40:59

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

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

有没有人成功实现了这个代码片段?我尝试过,并没有工作。 – 2017-02-04 13:28:01

+0

看这里:http://*.com/questions/35970970/django-rest-framework-permission-classes-of-viewset-method – 2017-02-04 16:08:50

+1

是的,它在我的情况下正常工作,我用这与用户注册视图,可以你请告诉我你收到了什么错误? – 2017-02-13 05:36:31

如果使用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'}) 
+3

您的PublicEndpoint实施与rest_framework.permissions.AllowAny – 2017-06-16 22:39:20

+1

@MikePlacentra相同是的,这整个答案可以由rest_framework.permissions替换import AllowAny&permission_classes =(AllowAny,) – 2017-12-01 07:24:51

您还可以通过应用它的类或方法,它适用于一个特定端点。只需要申请django rest框架允许任何权限到具体的方法或类。

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() 

您可以通过使用权限设置为空列表或元组达到同样的效果,但你会发现它很有用指定这个类,因为它使意图明确。