我正在为我的 API 服务使用 Django Rest Framework。在我的 settings.py 中,我有以下 REST_FRAMEWORK 设置:
REST_FRAMEWORK = {
...
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated'
)
...
}
现在我想更改权限类以允许任何人使用一个 View 。我使用过@permission_classes 装饰器。class UserViewSet(viewsets.ModelViewSet):
serializer_class = RegisterSerializer
queryset = User.objects.all()
@permission_classes([permissions.AllowAny,])
def create(self, request, *args, **kwargs):
data = request.data
...
我应该能够在没有任何权限的情况下执行创建操作。相反,我在尝试访问 API 时收到身份验证错误。 "detail": "Authentication credentials were not provided."
根据docs @permission_classes 装饰器是这种权限覆盖的正确方法。这是 Django 2.2.4 和 DRF 3.10.2。编辑
我忘了提到我不想让任何人访问任何 View ,只允许选择的 View 。大多数 View 应该具有全局设置的 IsAuthenticated 权限。
最佳答案
可以使用 DEFAULT_PERMISSION_CLASSES 设置全局设置默认权限策略。例如。
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
]}
如果未指定,则此设置默认为允许不受限制的访问:
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.AllowAny',
]}
如需进一步引用,您可以查看 DRF 文档 doc
编辑:
您可以使用自己的类覆盖权限:
from rest_framework import permissions
class SkipAuth(permissions.IsAuthenticated):
def has_permission(self, request, view):
return True
并使用此类跳过特定功能的身份验证:
@permission_classes([SkipAuth])
def create(self, request, *args, **kwargs):
data = request.data
...
关于django - 权限类装饰器被忽略。 "Authentication credentials were not provided"响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57551045/