我正在商店网站上工作,每个用户都将是匿名的(好吧,至少需要付费的时间),我正在尝试使用Django REST Framework提供产品API,但它一直抱怨:
"detail": "Authentication credentials were not provided."
我找到了一些与身份验证相关的设置,但我找不到像ENABLE_AUTHENTICATION = True
这样的内容。如何简单地禁用身份验证,让站点的任何访问者访问API?
答案 0 :(得分:42)
您可以在设置中为permission和authentication类提供空的默认值。
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)
如果使用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 :(得分: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