2014-11-23 121 views
27

我正在開發一個商店網站,每個用戶都將是匿名的(直到至少需要付款),並且我正在嘗試使用Django REST框架服務於產品的API,但它一直在抱怨:如何禁用Django REST框架中的身份驗證

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

我發現與身份驗證一些設置,但我無法找到像ENABLE_AUTHENTICATION = True東西。我如何簡單地禁用身份驗證,並讓任何訪問者訪問該站點的API?

+0

相關問題:http://stackoverflow.com/questions/35970970/django-rest-framework-permission-classes-of-viewset-method – 2017-02-04 16:09:13

回答

36

您可以在設置中給出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

21

您還可以禁用特定類或方法的身份驗證,只保留特定方法的裝飾器空白。

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://stackoverflow.com/questions/35970970/django-rest-framework-permission-classes-of-viewset-method – 2017-02-04 16:08:50

+1

是的,它在我的情況下正常工作,我用這與用戶註冊視圖,可以你請告訴我你收到了什麼錯誤? – 2017-02-13 05:36:31

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'}) 
+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

1

您還可以通過應用它的類或方法,它適用於一個特定端點。只需要申請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() 

您可以通過使用權限設置爲空列表或元組達到同樣的效果,但你會發現它很有用指定這個類,因爲它使意圖明確。