权限类装饰器被忽略。“未提供身份验证凭据”响应

Dan*_*usy 3 django permissions django-rest-framework

我正在使用 Django Rest Framework 作为我的 API 服务。在我的 settings.py 中,我有以下 REST_FRAMEWORK 设置:

REST_FRAMEWORK = {
    ...
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated'
    )
    ...
}
Run Code Online (Sandbox Code Playgroud)

现在我想更改权限类别以允许任何人使用一个视图。我使用了 @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
        ...
Run Code Online (Sandbox Code Playgroud)

我应该能够在没有任何权限的情况下执行创建操作。相反,当我尝试访问 API 时收到身份验证错误。

    "detail": "Authentication credentials were not provided."
Run Code Online (Sandbox Code Playgroud)

根据文档@permission_classes 装饰器是这种权限覆盖的正确方法。这是 Django 2.2.4 和 DRF 3.10.2。

编辑

我忘了提及,我不想允许任何人访问任何视图,而只允许访问所选的视图。大多数视图应该具有全局设置的 IsAuthenticated 权限。

Lok*_*esh 5

可以使用 DEFAULT_PERMISSION_CLASSES 设置全局设置默认权限策略。例如。

REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
    'rest_framework.permissions.IsAuthenticated',
]}
Run Code Online (Sandbox Code Playgroud)

如果未指定,此设置默认允许无限制访问:

REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
    'rest_framework.permissions.AllowAny',
]}
Run Code Online (Sandbox Code Playgroud)

如需进一步参考,您可以查看 DRF 文档doc

编辑:

您可以使用您自己的类来覆盖权限:

from rest_framework import permissions

class SkipAuth(permissions.IsAuthenticated):
    def has_permission(self, request, view):
    return True
Run Code Online (Sandbox Code Playgroud)

并使用此类跳过特定功能的身份验证,如下所示:

@permission_classes([SkipAuth])
def create(self, request, *args, **kwargs):
   data = request.data
   ...
Run Code Online (Sandbox Code Playgroud)